This R-markdown file presents all analyses for our paper titled “Voice quality and coda /r/ in Glasgow English in the early 20th century”. The analyses are presented in the same order as they are in the paper, and the section numbering also follows our paper (which means that it actually starts at 4.1, which is the first results section in the paper).

We start by importing all relevant libraries and the data. The details of the data processing (e.g. exclusion of outliers) are shown in a separate file titled data_prep.Rmd.

Let’s import the data and relevant libraries first. Note that we have saved our statistical models as RDS files, which allows the user to save time by not having to refit them (some of our generalised additive mixed models may take between 10 minutes to an hour to fit). The user has the option of re-fitting all models by changing the value of the refit_please variable to TRUE below.

library(lme4)
library(mgcv)
library(itsadug)
library(rms)
library(tidyverse)
library(stringr)
library(effects)
library(here)
library(afex)
refit_please <- F # please don't refit all the models - just load them from RDS files
# vowel data
vowels <- read_csv("data/vowels.csv")
Parsed with column specification:
cols(
  Speaker = col_character(),
  gender = col_character(),
  Target.stress = col_character(),
  Target.CELEX.phonemes = col_character(),
  Target.orthography = col_character(),
  Match.segments = col_character(),
  Target.segments = col_character(),
  Target.segments.start = col_double(),
  Target.segments.end = col_double(),
  time_0.5 = col_double(),
  vowel = col_character(),
  preceding = col_character(),
  following = col_character(),
  decade = col_character(),
  decade.fact = col_character(),
  duration = col_double(),
  f1 = col_double(),
  f2 = col_double(),
  f3 = col_double()
)
# formatting for mixed effects models
vowels$Speaker <- as.factor(vowels$Speaker)
vowels$Target.orthography <- as.factor(vowels$Target.orthography)
vowels$vowel <- as.factor(vowels$vowel)
vowels$decade <- ifelse(vowels$decade=="00", 2000, as.numeric(vowels$decade) + 1900)
vowels$decade.fact <- factor(vowels$decade.fact, levels=c("70","80","90","00"))
# /r/ data
R <- read_csv("data/R.csv") # F/M confuse read_csv...
Parsed with column specification:
cols(
  .default = col_double(),
  speaker = col_character(),
  traj = col_character(),
  gender = col_logical(),
  word = col_character(),
  preceding = col_character(),
  stress = col_character(),
  following = col_character(),
  foll.broad.f2 = col_character(),
  foll.broad.f3 = col_character(),
  position = col_character(),
  trans = col_character(),
  exclude = col_logical(),
  comment = col_character()
)
See spec(...) for full column specifications.
4554 parsing failures.
 row    col           expected actual         file
1090 gender 1/0/T/F/TRUE/FALSE      M 'data/R.csv'
1091 gender 1/0/T/F/TRUE/FALSE      M 'data/R.csv'
1092 gender 1/0/T/F/TRUE/FALSE      M 'data/R.csv'
1093 gender 1/0/T/F/TRUE/FALSE      M 'data/R.csv'
1094 gender 1/0/T/F/TRUE/FALSE      M 'data/R.csv'
.... ...... .................. ...... ............
See problems(...) for more details.
coltyps <- spec(R)
coltyps$cols$gender <- col_character()
# and again!
R <- read_csv("data/R.csv", col_types=coltyps)
132 parsing failures.
 row     col           expected actual         file
1233 exclude 1/0/T/F/TRUE/FALSE   unex 'data/R.csv'
1234 exclude 1/0/T/F/TRUE/FALSE   unex 'data/R.csv'
1235 exclude 1/0/T/F/TRUE/FALSE   unex 'data/R.csv'
1236 exclude 1/0/T/F/TRUE/FALSE   unex 'data/R.csv'
1237 exclude 1/0/T/F/TRUE/FALSE   unex 'data/R.csv'
.... ....... .................. ...... ............
See problems(...) for more details.
# some changes to variables to make them work with GAMMs
R <- R %>%
  mutate(stress = as.ordered(stress),
         start.event = (measurement.no==0),
         foll.broad.f3 = as.factor(foll.broad.f3),
         speaker = as.factor(speaker),
         word = as.factor(word))
contrasts(R$stress) <- "contr.treatment"
# separate data sets for males and females
R.m <- R %>%
  filter(gender=="M")
R.f <- R %>%
  filter(gender=="F")
# setting up variables for analysis via GAMMs
R$trans.broad <- recode(R$trans, wa="a")
R$trans.broad.fact <- as.ordered(R$trans.broad)
contrasts(R$trans.broad.fact) <- "contr.treatment"
R$gender.ordered <- as.ordered(R$gender)
contrasts(R$gender.ordered) <- "contr.treatment"
# auditory R data -- create data set with unique realisations
R.aud <- R[!(R$trans %in% c("", "?r")) & R$measurement.no==0,]
# only a few weakened approximants, so fold these into other categories
R.aud <- R %>%
  filter(!(trans %in% c("", "?r")), 
         !is.na(trans),
         measurement.no==0) %>%
  mutate(trans.broad=recode(trans, wa="a"),
         gender=recode(gender, M="male", `F`="female"))
# auditory voice quality data
# getting f3 avgs
avg.f3 <- unique(select(R, speaker, avg.f3))
# reading & formatting data
R.vq <- read_csv("data/auditoryvq.csv") %>%
  rename(speaker="speaker code",
         advanced.tip.blade="advanced tip/blade",
         tongue.body.height="tongue body height",
         tongue.body.front.backness="tongue body front-backness") %>%
  # join with avg.f3!
  inner_join(avg.f3, by="speaker") %>%
  mutate(gender=as.factor(ifelse(!is.na(str_match(speaker, "-m0")), "male", "female")),
         decade=unlist(substr(speaker, 1, 2)),
         decade=as.numeric(recode(decade, `00`="100")) + 1900)
Parsed with column specification:
cols(
  `speaker number` = col_double(),
  `speaker code` = col_character(),
  `advanced tip/blade` = col_double(),
  `tongue body height` = col_double(),
  `tongue body front-backness` = col_double(),
  RTR = col_double(),
  nasalization = col_double(),
  whispery = col_double(),
  `sounds?` = col_character()
)
Column `speaker` joining character vector and factor, coercing into character vector

4.1: Changes to coda /r/ – Take 1: Acoustic results

Males without baseline control

Analysing males first, not controlling for baseline F3. Fitting three models:

if (refit_please) {
  # model without AR
  system.time(
    R.m.mod.no.AR <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m)
  )
  # saveRDS(R.m.mod.no.AR, "models/R.m.mod.no.AR")
  
  # extracting empirical value of autocorrelation at lag 1
  R.m.rho <- start_value_rho(R.m.mod.no.AR)
  
  # full model with AR
  system.time(
    R.m.mod.AR <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
  # saveRDS(R.m.mod.AR, "models/R.m.mod.AR")
  
  summary(R.m.mod.AR)
  
  # nested model with AR
  system.time(
    R.m.mod.AR.min.decade <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          #s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
# saveRDS(R.m.mod.AR.min.decade, "models/R.m.mod.AR.min.decade")
}
R.m.mod.AR <- readRDS("models/R.m.mod.AR")
R.m.mod.AR.min.decade <- readRDS("models/R.m.mod.AR.min.decade")
compareML(R.m.mod.AR, R.m.mod.AR.min.decade) # significant overall effect of decade
R.m.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.mod.AR.min.decade: f3 ~ stress + s(measurement.no) + s(duration) + s(preceding.front, 
    k = 3) + s(measurement.no, by = stress) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Chi-square test of ML scores
-----

AIC difference: -0.11, model R.m.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848517, rho2 = 0.848517). 

Further questions (only first two of these discussed in paper):

if (refit_please) {
  # overall stress?
  system.time(
    R.m.mod.AR.min.stress <- bam(f3 ~ #stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          #s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
  # saveRDS(R.m.mod.AR.min.stress, "models/R.m.mod.AR.min.stress")
  # shape change?
  system.time(
    R.m.mod.AR.min.decade.shape <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
  # saveRDS(R.m.mod.AR.min.decade.shape, "models/R.m.mod.AR.min.decade.shape")
  # overall stress x decade?
  system.time(
    R.m.mod.AR.min.decade.stress <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
  # saveRDS(R.m.mod.AR.min.decade.stress, "models/R.m.mod.AR.min.decade.stress")
  
  # shape stress x decade?
  
  system.time(
    R.m.mod.AR.min.decade.stress.shape <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.rho)
  )
  # saveRDS(R.m.mod.AR.min.decade.stress.shape, "models/R.m.mod.AR.min.decade.stress.shape")
}
  
R.m.mod.AR.min.stress <- readRDS("models/R.m.mod.AR.min.stress")
R.m.mod.AR.min.decade.shape <- readRDS("models/R.m.mod.AR.min.decade.shape")
R.m.mod.AR.min.decade.stress <- readRDS("models/R.m.mod.AR.min.decade.stress")
R.m.mod.AR.min.decade.stress.shape <- readRDS("models/R.m.mod.AR.min.decade.stress.shape")
# overall stress?
compareML(R.m.mod.AR, R.m.mod.AR.min.stress, suggest.report=T) # non-sig
R.m.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.mod.AR.min.stress: f3 ~ s(measurement.no) + s(decade, k = 4) + s(duration) + s(preceding.front, 
    k = 3) + ti(measurement.no, decade, k = c(10, 4)) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.m.mod.AR is [not significantly?] better than model R.m.mod.AR.min.stress (X2(8.00)=6.385, p>.1).
-----

AIC difference: -8.00, model R.m.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848517, rho2 = 0.848517). 
# shape change?
compareML(R.m.mod.AR, R.m.mod.AR.min.decade.shape, suggest.report=T) # non-sig
R.m.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.mod.AR.min.decade.shape: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, duration) + 
    ti(measurement.no, preceding.front, k = c(10, 3)) + s(measurement.no, 
    foll.broad.f3, bs = "fs", m = 1, k = 4) + s(measurement.no, 
    speaker, bs = "fs", m = 1, k = 4) + s(measurement.no, word, 
    bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.m.mod.AR is [not significantly?] better than model R.m.mod.AR.min.decade.shape (X2(6.00)=3.128, p>.1).
-----

AIC difference: 2.06, model R.m.mod.AR.min.decade.shape has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848517, rho2 = 0.848517). Only small difference in ML...
# overall stress x decade?
compareML(R.m.mod.AR, R.m.mod.AR.min.decade.stress, suggest.report=T) # non-sig
R.m.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.mod.AR.min.decade.stress: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    ti(measurement.no, decade, k = c(10, 4)) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.m.mod.AR is [not significantly?] better than model R.m.mod.AR.min.decade.stress (X2(5.00)=4.364, p>.1).
-----

AIC difference: -8.76, model R.m.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848517, rho2 = 0.848517). Only small difference in ML...
# shape stress x decade?
compareML(R.m.mod.AR, R.m.mod.AR.min.decade.stress.shape) # non-sig
R.m.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.mod.AR.min.decade.stress.shape: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

Chi-square test of ML scores
-----

AIC difference: -5.97, model R.m.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848517, rho2 = 0.848517). Only small difference in ML...

Creating figure 2 bottom panel showing the model predictions for males.

# extracting model predictions (using plot_smooth from itsadug)
R.m.full.plot <- plot_smooth(R.m.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="full"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): full. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.122709575. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): labial. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-m06. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.m.schwa.plot <- plot_smooth(R.m.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="schwa"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): schwa. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.122709575. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): labial. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-m06. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.m.plot <- rbind(R.m.full.plot, R.m.schwa.plot)
# formatting decade predictor
R.m.plot$decade <- factor(R.m.plot$decade, levels=c("1970","1980","1990","2000"))
# creating the plot
ggplot(R.m.plot, aes(x=measurement.no, y=fit, group=decade, col=decade, lty=decade)) +
  geom_line(lwd=1) +
  facet_grid(.~stress) +
  geom_ribbon(aes(ymin=ll, ymax=ul, group=decade), col=NA,col="grey", alpha=0.1) +
  scale_color_manual(values=c("orange","darkorange3","deepskyblue1","deepskyblue4"),
                     name="decade of\nrecording") +
  scale_linetype_discrete(name="decade of\nrecording") +
  scale_x_continuous(name="measurement point", limits = c(0, 10), breaks=seq(0,10,2)) +
  scale_y_continuous(name="F3 (Hz)", limits=c(2000, 3050)) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("F3 changes for /r/ in males (not controlling for baseline F3)")
Duplicated aesthetics after name standardisation: colour

#ggsave("graphs/r_male_f3_change_no_control.pdf", width=8, height=4)

Females without baseline control

Analysing females, not controlling for baseline F3. Fitting three models:

if (refit_please) {
  # model without AR
  system.time(
    R.f.mod.no.AR <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f)
  )
  # saveRDS(R.f.mod.no.AR, "models/R.f.mod.no.AR")
  
  # extracting empirical value of autocorrelation at lag 1
  R.f.rho <- start_value_rho(R.f.mod.no.AR)
  
  # full model with AR
  system.time(
    R.f.mod.AR <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR, "models/R.f.mod.AR")
  
  summary(R.f.mod.AR)
  
  # nested model with AR
  system.time(
    R.f.mod.AR.min.decade <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          #s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR.min.decade, "models/R.f.mod.AR.min.decade")
}
R.f.mod.AR <- readRDS("models/R.f.mod.AR")
R.f.mod.AR.min.decade <- readRDS("models/R.f.mod.AR.min.decade")
compareML(R.f.mod.AR, R.f.mod.AR.min.decade) # significant overall effect of decade
R.f.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.mod.AR.min.decade: f3 ~ stress + s(measurement.no) + s(duration) + s(preceding.front, 
    k = 3) + s(measurement.no, by = stress) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Chi-square test of ML scores
-----

AIC difference: -7.77, model R.f.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850619, rho2 = 0.850619). 

Further questions (only first two of these discussed in paper):

if (refit_please) {
  # overall stress?
  system.time(
    R.f.mod.AR.min.stress <- bam(f3 ~ #stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          #s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR.min.stress, "models/R.f.mod.AR.min.stress")
  # shape change?
  system.time(
    R.f.mod.AR.min.decade.shape <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR.min.decade.shape, "models/R.f.mod.AR.min.decade.shape")
  # overall stress x decade?
  system.time(
    R.f.mod.AR.min.decade.stress <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR.min.decade.stress, "models/R.f.mod.AR.min.decade.stress")
  
  # shape stress x decade?
  
  system.time(
    R.f.mod.AR.min.decade.stress.shape <- bam(f3 ~ stress +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.rho)
  )
  # saveRDS(R.f.mod.AR.min.decade.stress.shape, "models/R.f.mod.AR.min.decade.stress.shape")
}
  
R.f.mod.AR.min.stress <- readRDS("models/R.f.mod.AR.min.stress")
R.f.mod.AR.min.decade.shape <- readRDS("models/R.f.mod.AR.min.decade.shape")
R.f.mod.AR.min.decade.stress <- readRDS("models/R.f.mod.AR.min.decade.stress")
R.f.mod.AR.min.decade.stress.shape <- readRDS("models/R.f.mod.AR.min.decade.stress.shape")
# overall stress?
compareML(R.f.mod.AR, R.f.mod.AR.min.stress, suggest.report=T) # sig
R.f.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.mod.AR.min.stress: f3 ~ s(measurement.no) + s(decade, k = 4) + s(duration) + s(preceding.front, 
    k = 3) + ti(measurement.no, decade, k = c(10, 4)) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.f.mod.AR is [marginally / significantly?] better than model R.f.mod.AR.min.stress (X2(8.00)=9.201, p0.018).
-----

AIC difference: -2.30, model R.f.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850619, rho2 = 0.850619). 
# shape change?
compareML(R.f.mod.AR, R.f.mod.AR.min.decade.shape, suggest.report=T) # sig
R.f.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.mod.AR.min.decade.shape: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, duration) + 
    ti(measurement.no, preceding.front, k = c(10, 3)) + s(measurement.no, 
    foll.broad.f3, bs = "fs", m = 1, k = 4) + s(measurement.no, 
    speaker, bs = "fs", m = 1, k = 4) + s(measurement.no, word, 
    bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.f.mod.AR is [marginally / significantly?] better than model R.f.mod.AR.min.decade.shape (X2(6.00)=8.210, p0.012).
-----

AIC difference: -9.33, model R.f.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850619, rho2 = 0.850619). 
# overall stress x decade?
compareML(R.f.mod.AR, R.f.mod.AR.min.decade.stress, suggest.report=T) # sig
R.f.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.mod.AR.min.decade.stress: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    ti(measurement.no, decade, k = c(10, 4)) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Report suggestion: The Chi-Square test on the ML scores indicates that model R.f.mod.AR is [marginally / significantly?] better than model R.f.mod.AR.min.decade.stress (X2(5.00)=6.830, p0.018).
-----

AIC difference: -4.35, model R.f.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850619, rho2 = 0.850619). 
# shape stress x decade?
compareML(R.f.mod.AR, R.f.mod.AR.min.decade.stress.shape) # sig
R.f.mod.AR: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.mod.AR.min.decade.stress.shape: f3 ~ stress + s(measurement.no) + s(decade, k = 4) + s(duration) + 
    s(preceding.front, k = 3) + s(measurement.no, by = stress) + 
    s(decade, k = 4, by = stress) + ti(measurement.no, decade, 
    k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

Chi-square test of ML scores
-----

AIC difference: -5.03, model R.f.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850619, rho2 = 0.850619). Only small difference in ML...

Creating figure 2 top panel showing the model predictions for females.

# extracting model predictions (using plot_smooth from itsadug)
R.f.full.plot <- plot_smooth(R.f.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="full"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): full. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.103923377. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): coronal. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-f01. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.f.schwa.plot <- plot_smooth(R.f.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="schwa"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): schwa. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.103923377. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): coronal. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-f01. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.f.plot <- rbind(R.f.full.plot, R.f.schwa.plot)
# formatting decade predictor
R.f.plot$decade <- factor(R.f.plot$decade, levels=c("1970","1980","1990","2000"))
  
# creating plot
ggplot(R.f.plot, aes(x=measurement.no, y=fit, group=decade, col=decade, lty=decade)) +
  geom_line(lwd=1) +
  facet_grid(.~stress) +
  geom_ribbon(aes(ymin=ll, ymax=ul, group=decade), col=NA,col="grey", alpha=0.1) +
  scale_color_manual(name="decade of\nrecording", values=c("orange","darkorange3","deepskyblue1","deepskyblue4")) +
  scale_linetype_discrete(name="decade of\nrecording") +
  scale_x_continuous(name="measurement point", limits = c(0, 10), breaks=seq(0,10,2)) +
  scale_y_continuous(name="F3 (Hz)", limits=c(2000, 3050)) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("F3 changes for /r/ in females (not controlling for baseline F3)")
Duplicated aesthetics after name standardisation: colour

#ggsave("graphs/r_female_f3_change_no_control.pdf", width=8, height=4)

4.2: Changes to coda /r/ – Take 1: Auditory results

First, we fit our model of dynamic F3 measurements as a function of /r/-realisation, whose predictions are plotted in figure 3.

if (refit_please) {
  # model without AR
  system.time(
    R.shapes.mod.no.AR <- bam(f3 ~ stress + trans.broad.fact + gender +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(measurement.no, by=trans.broad.fact) +
                          s(measurement.no, by=gender) +
                       # level 2: 2d smooths
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R)
  )
  #saveRDS(R.shapes.mod.no.AR, "models/R.shapes.mod.no.AR")
  
  # extracting empirical autocorrelation value at lag 1
  R.shapes.rho <- start_value_rho(R.shapes.mod.no.AR)
  # setting up start.event for use with AR1
  R$start.event <- R$measurement.no == 0
  
  # full model with AR
  system.time(
    R.shapes.mod.AR   <- bam(f3 ~ stress + trans.broad.fact + gender +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(measurement.no, by=trans.broad.fact) +
                          s(measurement.no, by=gender) +
                       # level 2: 2d smooths
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R,
                      AR.start=R$start.event, rho=R.shapes.rho,
                      method="ML")
  )
  #saveRDS(R.shapes.mod.AR, "models/R.shapes.mod.AR")
  
  summary(R.shapes.mod.AR)
  
  # nested model
  system.time(
    R.shapes.mod.AR.min.trans   <- bam(f3 ~ stress + gender + # trans.broad.fact + 
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(measurement.no, by=trans.broad.fact) +
                          s(measurement.no, by=gender) +
                       # level 2: 2d smooths
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R,
                      AR.start=R$start.event, rho=R.shapes.rho,
                      method="ML")
  )
  #saveRDS(R.shapes.mod.AR.min.trans, "models/R.shapes.mod.AR.min.trans")
}
R.shapes.mod.AR <- readRDS("models/R.shapes.mod.AR")
R.shapes.mod.AR.min.trans <- readRDS("models/R.shapes.mod.AR.min.trans")
compareML(R.shapes.mod.AR, R.shapes.mod.AR.min.trans)
R.shapes.mod.AR: f3 ~ stress + trans.broad.fact + gender + s(measurement.no) + 
    s(duration) + s(preceding.front, k = 3) + s(measurement.no, 
    by = stress) + s(measurement.no, by = trans.broad.fact) + 
    s(measurement.no, by = gender) + ti(measurement.no, duration) + 
    ti(measurement.no, preceding.front, k = c(10, 3)) + s(measurement.no, 
    foll.broad.f3, bs = "fs", m = 1, k = 4) + s(measurement.no, 
    speaker, bs = "fs", m = 1, k = 4) + s(measurement.no, word, 
    bs = "fs", m = 1, k = 4)

R.shapes.mod.AR.min.trans: f3 ~ stress + gender + s(measurement.no) + s(duration) + s(preceding.front, 
    k = 3) + s(measurement.no, by = stress) + s(measurement.no, 
    by = gender) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

Chi-square test of ML scores
-----

AIC difference: -192.66, model R.shapes.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.860217, rho2 = 0.860217). 

Now creating figure 3.

# extracting model predictions
R.shapes <- plot_smooth(R.shapes.mod.AR, view="measurement.no", plot_all="trans.broad.fact",
                        cond=list(gender="F"), rm.ranef=T, rug=F)[[1]]
Summary:
    * stress : factor; set to the value(s): schwa. 
    * trans.broad.fact : factor; set to the value(s): a, i, o, r, t, wt. 
    * gender : factor; set to the value(s): F. 
    * measurement.no : numeric predictor; with 30 values ranging from 0.000000 to 10.000000. 
    * duration : numeric predictor; set to the value(s): 0.11452771. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): labial. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-f01. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

# releveling, meaningful names for realisations
R.shapes$trans.broad.fact <- factor(R.shapes$trans.broad.fact, levels=c("o","i","wt","a","t","r"))
R.shapes <- R.shapes %>% 
  mutate(realisation=recode(trans.broad.fact,
                            o="zero",
                            i="intermediate",
                            wt="weakened tap",
                            a="approximant",
                            t="full tap",
                            r="trill"),
         realisation=factor(realisation, 
                            levels=c("zero",
                                     "intermediate",
                                     "weakened tap",
                                     "approximant",
                                     "full tap",
                                     "trill"))
  )
# excluding trills
R.shapes <- filter(R.shapes, trans.broad.fact != "r")
# creating graph
ggplot(R.shapes, aes(x=measurement.no, y=fit, col=realisation, lty=realisation)) +
  geom_ribbon(aes(ymin=ll, ymax=ul, group=trans.broad.fact), alpha=0.05, colour=NA) +
  geom_line(lwd=1) +
  scale_linetype_manual(values = c(3,4,2,
                              5,1),
                     name="/r/ realisation") +
  scale_colour_manual(values = c("orange","darkorange1",
                               "darkorange3","deepskyblue1",
                               "deepskyblue3"),
                      name="/r/ realisation") +
  scale_x_continuous(name="measurement point", limits = c(0, 10), breaks=seq(0,10,2)) +
  scale_y_continuous(name="F3 (Hz)", limits=c(2450,2950)) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("Acoustic correlates of different /r/ realisations in F3")

#ggsave("graphs/r_acoustic_correlates.pdf", width=6, height=4)

We now create figure 4, that is, the proportions of different realisations as a function of time.

# calculating proportions
R.props.dec <- R.aud %>% 
  count(decade, gender, trans.broad) %>% 
  group_by(decade, gender) %>%
  mutate(prop = n/sum(n)) %>%
  ungroup()
# releveling
R.props.dec$trans.broad <- factor(R.props.dec$trans.broad, levels=c("o","i","wt","a","t","r"))
# creating the graph
ggplot(R.props.dec, aes(x=decade, fill=trans.broad)) + 
  geom_bar(aes(y=prop), stat="identity", position="stack") + 
  facet_wrap(~gender) + 
  scale_fill_manual(values = c("orange","darkorange1",
                               "darkorange3","deepskyblue1",
                               "deepskyblue3","deepskyblue4"),
                     name="/r/ realisation", 
                    labels=c("zero","intermediate",
                             "weakened tap","approximant",
                             "tap","trill")) +
  scale_y_continuous(labels = scales::percent, name="percentage of realisations") +
  scale_x_continuous(name = "decade of recording") +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
ggtitle("Changes in proportions of auditory /r/ variants")

#ggsave("graphs/r_auditory.pdf", width=8, height=4)

We now run the logistic regression models whose results are reported in section 4.2 of the paper.

# creating a strength of /r/ variable and a presence of /r/ variable (both binary)
R.aud <- mutate(R.aud, r.strength=recode(trans.broad, 
                                    t="strong",
                                    a="strong",
                                    r="strong",
                                    wt="weak",
                                    i="weak",
                                    o="weak"),
                       r.presence=recode(trans.broad, 
                                    t="present",
                                    a="present",
                                    r="present",
                                    wt="present",
                                    i="deleted",
                                    o="deleted") 
                )
R.aud$r.strength <- factor(R.aud$r.strength, levels=c("weak","strong"))
R.aud$r.presence <- factor(R.aud$r.presence, levels=c("deleted","present"))
if (refit_please) {
  # note the absence of random slopes over decade by word (not possible to include due to non-convergence)
  # full model for strength
  r.str.mod <- glmer(r.strength ~ scale(decade) * gender + stress +
                                (1 | speaker) +
                                (1 | word),
                        data=R.aud,
                        family="binomial")
  #saveRDS(r.str.mod, "models/r.str.mod")
  
  # nested model for strength
  r.str.mod.min.decade <- glmer(r.strength ~ gender + stress +
                                (1 | speaker) +
                                (1 | word),
                        data=R.aud,
                        family="binomial")
  #saveRDS(r.str.mod.min.decade, "models/r.str.mod.min.decade")
  
  # note the absence of random slopes over decade by word (not possible to include due to non-convergence)
  # full model for /r/ presence
  r.pres.mod <- glmer(r.presence ~ scale(decade) * gender + stress +
                                (1 | speaker) +
                                (1 | word),
                        data=R.aud,
                        family="binomial",
                        control=glmerControl(optimizer="bobyqa",
                              optCtrl=list(maxfun=2e5)))
  #saveRDS(r.pres.mod, "models/r.pres.mod")
  
  # nested model for /r/ presence
  r.pres.mod.min.decade <- glmer(r.presence ~ gender + stress +
                                (1 | speaker) +
                                (1 | word),
                        data=R.aud,
                        family="binomial")
  #saveRDS(r.pres.mod.min.decade, "models/r.pres.mod.min.decade")
}
r.str.mod <- readRDS("models/r.str.mod")
r.str.mod.min.decade <- readRDS("models/r.str.mod.min.decade")
r.pres.mod <- readRDS("models/r.pres.mod")
r.pres.mod.min.decade <- readRDS("models/r.pres.mod.min.decade")
summary(r.str.mod)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: binomial  ( logit )
Formula: r.strength ~ scale(decade) * gender + stress + (1 | speaker) +      (1 | word)
   Data: R.aud

     AIC      BIC   logLik deviance df.resid 
  1031.4   1064.2   -508.7   1017.4      799 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6444 -0.7391 -0.5031  0.9313  3.7346 

Random effects:
 Groups  Name        Variance Std.Dev.
 word    (Intercept) 0.4511   0.6717  
 speaker (Intercept) 0.3346   0.5784  
Number of obs: 806, groups:  word, 138; speaker, 24

Fixed effects:
                          Estimate Std. Error z value Pr(>|z|)  
(Intercept)              -0.456095   0.254805  -1.790   0.0735 .
scale(decade)            -0.275813   0.206426  -1.336   0.1815  
gendermale                0.028435   0.287716   0.099   0.9213  
stressschwa              -0.004962   0.185419  -0.027   0.9786  
scale(decade):gendermale  0.051526   0.288656   0.179   0.8583  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(d) gndrml strsss
scale(decd)  0.031                     
gendermale  -0.590 -0.029              
stressschwa -0.469  0.001  0.023       
scl(dcd):gn -0.014 -0.714  0.028 -0.027
summary(r.pres.mod)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
 Family: binomial  ( logit )
Formula: r.presence ~ scale(decade) * gender + stress + (1 | speaker) +      (1 | word)
   Data: R.aud
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))

     AIC      BIC   logLik deviance df.resid 
   857.4    890.2   -421.7    843.4      799 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7662 -0.6148  0.3946  0.5393  1.7176 

Random effects:
 Groups  Name        Variance Std.Dev.
 word    (Intercept) 0.6589   0.8117  
 speaker (Intercept) 0.3310   0.5753  
Number of obs: 806, groups:  word, 138; speaker, 24

Fixed effects:
                         Estimate Std. Error z value Pr(>|z|)    
(Intercept)               1.52029    0.29174   5.211 1.88e-07 ***
scale(decade)            -0.30539    0.21109  -1.447   0.1480    
gendermale                0.41775    0.30091   1.388   0.1650    
stressschwa              -0.47407    0.21591  -2.196   0.0281 *  
scale(decade):gendermale  0.03613    0.29750   0.121   0.9033    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(d) gndrml strsss
scale(decd) -0.026                     
gendermale  -0.502  0.025              
stressschwa -0.510  0.026 -0.023       
scl(dcd):gn  0.027 -0.712 -0.034 -0.045
# model comparisons reported in paper
anova(r.str.mod, r.str.mod.min.decade,test="Chisq")
Data: R.aud
Models:
r.str.mod.min.decade: r.strength ~ gender + stress + (1 | speaker) + (1 | word)
r.str.mod: r.strength ~ scale(decade) * gender + stress + (1 | speaker) + 
r.str.mod:     (1 | word)
                     Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
r.str.mod.min.decade  5 1030.3 1053.7 -510.14   1020.3                         
r.str.mod             7 1031.4 1064.2 -508.70   1017.4 2.8712      2      0.238
anova(r.pres.mod, r.pres.mod.min.decade,test="Chisq")
Data: R.aud
Models:
r.pres.mod.min.decade: r.presence ~ gender + stress + (1 | speaker) + (1 | word)
r.pres.mod: r.presence ~ scale(decade) * gender + stress + (1 | speaker) + 
r.pres.mod:     (1 | word)
                      Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
r.pres.mod.min.decade  5 856.85 880.31 -423.43   846.85                         
r.pres.mod             7 857.38 890.23 -421.69   843.38 3.4693      2     0.1765

5.1 Acoustic results for voice quality

First some plots showing the raw data for F1/F2/F3 broken down by vowels (these are especially useful as they show that all vowels show a rise in F39.

ggplot(vowels, aes(x=decade.fact, y=f1)) +
  facet_grid(gender ~ vowel) +
  geom_boxplot()

ggplot(vowels, aes(x=decade.fact, y=f2)) +
  facet_grid(gender ~ vowel) +
  geom_boxplot()

ggplot(vowels, aes(x=decade.fact, y=f3)) +
  facet_grid(gender ~ vowel) +
  geom_boxplot()

Modelling F1/F2/F3

We’ll fit linear mixed models to F1/F2/F3, running the models in separate R-markdown chunks.

First F1:

# this is the model that we would like to have - but it
# does not converge due to a singularity involving 
# the decade by vowel random slope
# f1.mod.full <- lmer(f1 ~ gender * decade.fact +
#                           scale(duration) +
#                             (1 + decade.fact | vowel) +
#                             (1 | Target.orthography) +
#                             (1 | Speaker),
#               data=vowels, REML=F)
# these are two alternative models; model 1 forces the decade
# effect to be linear
if (refit_please) {
  f1.mod.full.1 <- lmer(f1 ~ gender * scale(decade) + 
                           scale(duration) +
                               (1 + scale(decade) | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f1.mod.full.1, "models/f1.mod.full.1")
  
  # model 2 has no by-vowel random slope for decade (but the decade
  # effect is allowed to be non-linear)
  
  f1.mod.full.2 <- lmer(f1 ~ gender * decade.fact + 
                           scale(duration) +
                               (1 | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f1.mod.full.2, "models/f1.mod.full.2")
  
  # neither model shows a significant effect of decade:
  # (and note that model 2 is expected to be anti-conservative with
  #  respect to decade!)
  
  f1.mod.comp.1 <- lmer(f1 ~ gender + scale(duration) +
                               (1 + scale(decade) | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f1.mod.comp.1, "models/f1.mod.comp.1")
  f1.mod.comp.2 <- lmer(f1 ~ gender + scale(duration) +
                               (1 | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f1.mod.comp.2, "models/f1.mod.comp.2")
}
f1.mod.full.1 <- readRDS("models/f1.mod.full.1")
f1.mod.full.2 <- readRDS("models/f1.mod.full.2")
f1.mod.comp.1 <- readRDS("models/f1.mod.comp.1")
f1.mod.comp.2 <- readRDS("models/f1.mod.comp.2")
anova(f1.mod.full.1, f1.mod.comp.1) # non-sig
Data: vowels
Models:
f1.mod.comp.1: f1 ~ gender + scale(duration) + (1 + scale(decade) | vowel) + 
f1.mod.comp.1:     (1 | Target.orthography) + (1 | Speaker)
f1.mod.full.1: f1 ~ gender * scale(decade) + scale(duration) + (1 + scale(decade) | 
f1.mod.full.1:     vowel) + (1 | Target.orthography) + (1 | Speaker)
              Df   AIC   BIC logLik deviance Chisq Chi Df Pr(>Chisq)
f1.mod.comp.1  9 85694 85756 -42838    85676                        
f1.mod.full.1 11 85695 85772 -42837    85673 2.381      2     0.3041
anova(f1.mod.full.2, f1.mod.comp.2) # non-sig
Data: vowels
Models:
f1.mod.comp.2: f1 ~ gender + scale(duration) + (1 | vowel) + (1 | Target.orthography) + 
f1.mod.comp.2:     (1 | Speaker)
f1.mod.full.2: f1 ~ gender * decade.fact + scale(duration) + (1 | vowel) + (1 | 
f1.mod.full.2:     Target.orthography) + (1 | Speaker)
              Df   AIC   BIC logLik deviance  Chisq Chi Df Pr(>Chisq)
f1.mod.comp.2  7 85710 85759 -42848    85696                         
f1.mod.full.2 13 85717 85807 -42845    85691 5.4121      6     0.4921

F1 does not show a significant change.

# this is the model that we would like to have - but it
# does not converge due to a singularity involving 
# the decade by vowel random slope
# f2.mod.full <- lmer(f2 ~ gender * decade.fact +
#                           scale(duration) +
#                             (1 + decade.fact | vowel) +
#                             (1 | Target.orthography) +
#                             (1 | Speaker),
#               data=vowels, REML=F)
# these are two alternative models; model 1 forces the decade
# effect to be linear
if (refit_please) {
  f2.mod.full.1 <- lmer(f2 ~ gender * scale(decade) + 
                           scale(duration) +
                               (1 + scale(decade) | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f2.mod.full.1, "models/f2.mod.full.1")
  
  # model 2 has no by-vowel random slope for decade (but the decade
  # effect is allowed to be non-linear)
  
  f2.mod.full.2 <- lmer(f2 ~ gender * decade.fact + 
                           scale(duration) +
                               (1 | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f2.mod.full.2, "models/f2.mod.full.2")
  
  # neither model shows a significant effect of decade:
  # (and note that model 2 is expected to be anti-conservative with
  #  respect to decade!)
  
  f2.mod.comp.1 <- lmer(f2 ~ gender + scale(duration) +
                               (1 + scale(decade) | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f2.mod.comp.1, "models/f2.mod.comp.1")
  f2.mod.comp.2 <- lmer(f2 ~ gender + scale(duration) +
                               (1 | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f2.mod.comp.2, "models/f2.mod.comp.2")
}
f2.mod.full.1 <- readRDS("models/f2.mod.full.1")
f2.mod.comp.1 <- readRDS("models/f2.mod.comp.1")
f2.mod.full.2 <- readRDS("models/f2.mod.full.2")
f2.mod.comp.2 <- readRDS("models/f2.mod.comp.2")
anova(f2.mod.full.1, f2.mod.comp.1) # non-sig
Data: vowels
Models:
f2.mod.comp.1: f2 ~ gender + scale(duration) + (1 + scale(decade) | vowel) + 
f2.mod.comp.1:     (1 | Target.orthography) + (1 | Speaker)
f2.mod.full.1: f2 ~ gender * scale(decade) + scale(duration) + (1 + scale(decade) | 
f2.mod.full.1:     vowel) + (1 | Target.orthography) + (1 | Speaker)
              Df    AIC    BIC logLik deviance  Chisq Chi Df Pr(>Chisq)  
f2.mod.comp.1  9 101665 101727 -50823   101647                           
f2.mod.full.1 11 101664 101740 -50821   101642 5.0774      2    0.07897 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(f2.mod.full.2, f2.mod.comp.2) # non-sig
Data: vowels
Models:
f2.mod.comp.2: f2 ~ gender + scale(duration) + (1 | vowel) + (1 | Target.orthography) + 
f2.mod.comp.2:     (1 | Speaker)
f2.mod.full.2: f2 ~ gender * decade.fact + scale(duration) + (1 | vowel) + (1 | 
f2.mod.full.2:     Target.orthography) + (1 | Speaker)
              Df    AIC    BIC logLik deviance  Chisq Chi Df Pr(>Chisq)
f2.mod.comp.2  7 102735 102783 -51360   102721                         
f2.mod.full.2 13 102742 102833 -51358   102716 4.4788      6     0.6122

F2 does not show a significant change.

Now for F3:

if (refit_please) {
  f3.mod.full <- lmer(f3 ~ gender * decade.fact + 
                           scale(duration) +
                               (1 + decade.fact | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f3.mod.full, "models/f3.mod.full")
  #summary(f3.mod.full)
  
  
  f3.mod.comp <- lmer(f3 ~ gender + scale(duration) +
                               (1 + decade.fact | vowel) +
                               (1 | Target.orthography) +
                               (1 | Speaker),
                 data=vowels, REML=F)
  # saveRDS(f3.mod.comp, "models/f3.mod.comp")
}
f3.mod.full <- readRDS("models/f3.mod.full")
f3.mod.comp <- readRDS("models/f3.mod.comp")
anova(f3.mod.full, f3.mod.comp)
Data: vowels
Models:
f3.mod.comp: f3 ~ gender + scale(duration) + (1 + decade.fact | vowel) + (1 | 
f3.mod.comp:     Target.orthography) + (1 | Speaker)
f3.mod.full: f3 ~ gender * decade.fact + scale(duration) + (1 + decade.fact | 
f3.mod.full:     vowel) + (1 | Target.orthography) + (1 | Speaker)
            Df    AIC    BIC logLik deviance  Chisq Chi Df Pr(>Chisq)   
f3.mod.comp 16 102962 103073 -51465   102930                            
f3.mod.full 22 102952 103105 -51454   102908 22.166      6    0.00113 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

F3 clearly rises significantly over time. Prediction plot for the paper, i.e. figure 5:

# extracting predictions from the model
new.dat <- expand.grid(gender=unique(vowels$gender),
                       decade.fact=levels(vowels$decade.fact),
                       duration=median(vowels$duration),
                       vowel=unique(vowels$vowel)[1])
new.dat$f3 <- 0
new.dat$f3 <- predict(f3.mod.full, new.dat, re.form=NA)
mm <- model.matrix(terms(f3.mod.full),new.dat) # for confidence intervals
pvar1 <- diag(mm %*% tcrossprod(vcov(f3.mod.full),mm))
new.dat <- data.frame(
    new.dat,
    lower = new.dat$f3-2*sqrt(pvar1),
    upper = new.dat$f3+2*sqrt(pvar1)
)
# creating the graph
mean_fun <- function(x){
  return(data.frame(y = mean(x), label = paste0("  ", round(mean(x)), " Hz")))
}
ggplot(new.dat, aes(x=decade.fact, y=f3, col=gender)) +
  geom_violin(data=vowels, aes(fill=gender, col=NA), alpha=0.2, show.legend=F) +
  geom_point(size=2, position=position_dodge(width=0.9)) +
  geom_errorbar(aes(ymin=lower, ymax=upper), width=0.25, position=position_dodge(width=0.9)) +
  stat_summary(fun.data = mean_fun, geom = "text", size=4, position=position_dodge(0.9), hjust=0, show.legend=F) +
  scale_color_manual(name="gender",breaks=c("F","M"), labels=c("female", "male"), 
                     values=c("deepskyblue4","orange")) +
  scale_fill_manual(name="gender",breaks=c("F","M"), labels=c("female", "male"), 
                     values=c("deepskyblue4","orange"), guide=F) +
  scale_x_discrete(name="decade of recording", labels=c(1970,1980,1990,2000), expand=expand_scale(add=c(0.05,1))) +
  scale_y_continuous(name="F3") +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank()) +
  ggtitle("F3 changes for vowels (with model predictions)")

#ggsave("graphs/vowels_f3_change.pdf", width=8, height=4)
  

5.2 Auditory results for voice quality

We first fit a model that shows how F3 correlates with different auditory measures

vq.f3.model <- lm(avg.f3 ~ advanced.tip.blade + 
             tongue.body.height + 
             tongue.body.front.backness + 
             gender, data=R.vq)
summary(vq.f3.model)

Call:
lm(formula = avg.f3 ~ advanced.tip.blade + tongue.body.height + 
    tongue.body.front.backness + gender, data = R.vq)

Residuals:
    Min      1Q  Median      3Q     Max 
-232.20 -110.79   12.56   90.08  253.19 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 2764.70     125.14  22.093 1.72e-14 ***
advanced.tip.blade           -77.74      62.35  -1.247 0.228461    
tongue.body.height            66.50      26.90   2.472 0.023643 *  
tongue.body.front.backness   -92.19      52.15  -1.768 0.094008 .  
gendermale                  -346.30      77.08  -4.493 0.000281 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 165.6 on 18 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.6679,    Adjusted R-squared:  0.5942 
F-statistic: 9.052 on 4 and 18 DF,  p-value: 0.0003441

We then fit three separate models (with decade centred and gender sum coded) to check for decade / gender effects in our three auditory measures.

# centring decade
R.vq$decade.centred <- scale(R.vq$decade, scale=F)
# sum coding gender
R.vq$gender.sum <- R.vq$gender
contrasts(R.vq$gender.sum) <- contr.sum(2)
# fitting and summarising models
summary(lm(tongue.body.height ~ decade.centred + gender.sum, data=R.vq))

Call:
lm(formula = tongue.body.height ~ decade.centred + gender.sum, 
    data = R.vq)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1958 -0.8708 -0.4042  0.8042  2.8458 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)   
(Intercept)    -0.93750    0.27147  -3.453  0.00238 **
decade.centred  0.04083    0.02428   1.682  0.10744   
gender.sum1     0.52083    0.27147   1.919  0.06874 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.33 on 21 degrees of freedom
Multiple R-squared:  0.2366,    Adjusted R-squared:  0.1639 
F-statistic: 3.254 on 2 and 21 DF,  p-value: 0.05873
summary(lm(tongue.body.front.backness ~ decade.centred + gender.sum, data=R.vq))

Call:
lm(formula = tongue.body.front.backness ~ decade.centred + gender.sum, 
    data = R.vq)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72083 -0.55000 -0.04167  0.37083  2.27917 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)    -1.687500   0.150355 -11.223 2.48e-10 ***
decade.centred -0.009167   0.013448  -0.682    0.503    
gender.sum1     0.270833   0.150355   1.801    0.086 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7366 on 21 degrees of freedom
Multiple R-squared:  0.1501,    Adjusted R-squared:  0.06918 
F-statistic: 1.855 on 2 and 21 DF,  p-value: 0.1812
summary(lm(advanced.tip.blade ~ decade.centred + gender.sum, data=R.vq))

Call:
lm(formula = advanced.tip.blade ~ decade.centred + gender.sum, 
    data = R.vq)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.75535 -0.54625 -0.00076  0.40826  0.99924 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     1.58716    0.12417  12.783 4.42e-11 ***
decade.centred -0.00818    0.01091  -0.750    0.462    
gender.sum1     0.04549    0.12417   0.366    0.718    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5948 on 20 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.03418,   Adjusted R-squared:  -0.0624 
F-statistic: 0.3539 on 2 and 20 DF,  p-value: 0.7063

Create figure 6.

# getting counts of different tongue body height values per decade
R.vq.count <- dplyr::count(R.vq, tongue.body.height, decade)
# arranging by decade / tongue body height
R.vq.ordered <- R.vq %>% 
  arrange(decade, tongue.body.height)
# creating graph
ggplot(R.vq.ordered, aes(x=factor(decade), y=tongue.body.height)) +
  geom_point(x=1,y=1, aes(colour="Female")) + # this is a hack for getting the legend right 
  geom_point(x=1,y=1, aes(colour="Male")) + # this is a hack for getting the legend right 
  scale_color_manual(name="Gender", values=c("deepskyblue4","orange"), breaks=c("Female","Male")) +
  geom_dotplot(binaxis="y", stackdir="center", binpositions="all",
               fill=ifelse(R.vq.ordered$gender=="female", "deepskyblue4","orange"),
               col=NA, dotsize=1.5) +
  stat_summary(fun.y=mean, fun.ymin=mean, fun.ymax=mean, geom="crossbar", aes(group=decade), width=0.4, col="grey") +
  scale_x_discrete(name="Decade of recording") +
  scale_y_continuous(name="Tongue body height") +
  guides(colour = guide_legend(override.aes = list(size = 4))) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("Changes in tongue body height over time")

# ggsave("graphs/tongue_body_height.pdf", width=6, height=4)

Changes to Coda R: take 2 – acoustic analysis

Males, take 2 (with baseline control)

Same modelling strategy as above.

if (refit_please) {
  # model without AR
  system.time(
    R.m.baseline.mod.no.AR <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m)
  )
  # saveRDS(R.m.baseline.mod.no.AR, "models/R.m.baseline.mod.no.AR")
  
  # extracting empirical autocorrelation values at lag 1
  R.m.baseline.rho <- start_value_rho(R.m.baseline.mod.no.AR)
  
  # full model with AR
  system.time(
    R.m.baseline.mod.AR <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.baseline.rho)
  )
  # saveRDS(R.m.baseline.mod.AR, "models/R.m.baseline.mod.AR")
  
  summary(R.m.baseline.mod.AR)
  
  # nested model
  system.time(
    R.m.baseline.mod.AR.min.decade <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          #s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.m, method="ML",
                      AR.start=R.m$start.event, rho=R.m.baseline.rho)
  )
# saveRDS(R.m.baseline.mod.AR.min.decade, "models/R.m.baseline.mod.AR.min.decade")
}
R.m.baseline.mod.AR <- readRDS("models/R.m.baseline.mod.AR")
R.m.baseline.mod.AR.min.decade <- readRDS("models/R.m.baseline.mod.AR.min.decade")
compareML(R.m.baseline.mod.AR, R.m.baseline.mod.AR.min.decade)
R.m.baseline.mod.AR: f3 ~ stress + avg.f3 + s(measurement.no) + s(decade, k = 4) + 
    s(duration) + s(preceding.front, k = 3) + s(measurement.no, 
    by = stress) + s(decade, k = 4, by = stress) + ti(measurement.no, 
    decade, k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.m.baseline.mod.AR.min.decade: f3 ~ stress + avg.f3 + s(measurement.no) + s(duration) + s(preceding.front, 
    k = 3) + s(measurement.no, by = stress) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Chi-square test of ML scores
-----

AIC difference: -0.04, model R.m.baseline.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.848567, rho2 = 0.848567). Only small difference in ML...

Creating the bottom panel of figure 7.

# extracting predictions, formatting decade
R.m.baseline.full.plot <- plot_smooth(R.m.baseline.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="full"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): full. 
    * avg.f3 : numeric predictor; set to the value(s): 2405.03714710253. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.122709575. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): labial. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-m06. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.m.baseline.schwa.plot <- plot_smooth(R.m.baseline.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="schwa"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): schwa. 
    * avg.f3 : numeric predictor; set to the value(s): 2405.03714710253. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.122709575. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): labial. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-m06. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.m.baseline.plot <- rbind(R.m.baseline.full.plot, R.m.baseline.schwa.plot)
R.m.baseline.plot$decade <- factor(R.m.baseline.plot$decade, levels=c("1970","1980","1990","2000"))
# create graph
ggplot(R.m.baseline.plot, aes(x=measurement.no, y=fit, group=decade, col=decade, lty=decade)) +
  geom_line(lwd=1) +
  facet_grid(.~stress) +
  geom_ribbon(aes(ymin=ll, ymax=ul, group=decade), col=NA,col="grey", alpha=0.1) +
  scale_color_manual(name="decade of\nrecording", values=c("orange","darkorange3","deepskyblue1","deepskyblue4")) +
  scale_linetype_discrete(name="decade of\nrecording") +
  scale_x_continuous(name="measurement point", limits = c(0, 10), breaks=seq(0,10,2)) +
  scale_y_continuous(name="F3 (Hz)", limits=c(2000, 3050)) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("F3 changes for /r/ in males (controlling for baseline F3)")
Duplicated aesthetics after name standardisation: colour

#ggsave("graphs/r_male_f3_change_control.pdf", width=8, height=4)

Females, take 2 (with baseline control)

Same modelling strategy as above.

if (refit_please) {
  # model without AR
  system.time(
    R.f.baseline.mod.no.AR <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f)
  )
  # saveRDS(R.f.baseline.mod.no.AR, "models/R.f.baseline.mod.no.AR")
  
  # extracting empirical autocorrelation value at lag 1
  R.f.baseline.rho <- start_value_rho(R.f.baseline.mod.no.AR)
  
  # full model with AR
  system.time(
    R.f.baseline.mod.AR <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.baseline.rho)
  )
  # saveRDS(R.f.baseline.mod.AR, "models/R.f.baseline.mod.AR")
  
  summary(R.f.baseline.mod.AR)
  
  # nested model
  system.time(
    R.f.baseline.mod.AR.min.decade <- bam(f3 ~ stress +
                          avg.f3 +
                       # level 1 smooth terms
                          s(measurement.no) +
                          #s(decade, k=4) +
                          s(duration) +
                          s(preceding.front, k=3) +
                       # level 2: by terms
                          s(measurement.no, by=stress) +
                          #s(decade, k=4, by=stress) +
                       # level 2: 2d smooths
                          #ti(measurement.no, decade, k=c(10,4)) +
                          ti(measurement.no, duration) +
                          ti(measurement.no, preceding.front, k=c(10,3)) +
                       # level 3: 2d smooth by terms
                          #ti(measurement.no, decade, k=c(10,4), by=stress) +
                       # random smooths
                          s(measurement.no, foll.broad.f3, bs="fs", m=1, k=4) +
                          s(measurement.no, speaker, bs="fs", m=1, k=4) +
                          s(measurement.no, word, bs="fs", m=1, k=4),
                      dat=R.f, method="ML",
                      AR.start=R.f$start.event, rho=R.f.baseline.rho)
  )
  # saveRDS(R.f.baseline.mod.AR.min.decade, "models/R.f.baseline.mod.AR.min.decade")
}
R.f.baseline.mod.AR <- readRDS("models/R.f.baseline.mod.AR")
R.f.baseline.mod.AR.min.decade <- readRDS("models/R.f.baseline.mod.AR.min.decade")
compareML(R.f.baseline.mod.AR, R.f.baseline.mod.AR.min.decade)
R.f.baseline.mod.AR: f3 ~ stress + avg.f3 + s(measurement.no) + s(decade, k = 4) + 
    s(duration) + s(preceding.front, k = 3) + s(measurement.no, 
    by = stress) + s(decade, k = 4, by = stress) + ti(measurement.no, 
    decade, k = c(10, 4)) + ti(measurement.no, duration) + ti(measurement.no, 
    preceding.front, k = c(10, 3)) + ti(measurement.no, decade, 
    k = c(10, 4), by = stress) + s(measurement.no, foll.broad.f3, 
    bs = "fs", m = 1, k = 4) + s(measurement.no, speaker, bs = "fs", 
    m = 1, k = 4) + s(measurement.no, word, bs = "fs", m = 1, 
    k = 4)

R.f.baseline.mod.AR.min.decade: f3 ~ stress + avg.f3 + s(measurement.no) + s(duration) + s(preceding.front, 
    k = 3) + s(measurement.no, by = stress) + ti(measurement.no, 
    duration) + ti(measurement.no, preceding.front, k = c(10, 
    3)) + s(measurement.no, foll.broad.f3, bs = "fs", m = 1, 
    k = 4) + s(measurement.no, speaker, bs = "fs", m = 1, k = 4) + 
    s(measurement.no, word, bs = "fs", m = 1, k = 4)

Chi-square test of ML scores
-----

AIC difference: -7.88, model R.f.baseline.mod.AR has lower AIC.
 AIC might not be reliable, as an AR1 model is included (rho1 = 0.850645, rho2 = 0.850645). 

Creating the top panel of figure 7.

R.f.baseline.full.plot <- plot_smooth(R.f.baseline.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="full"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): full. 
    * avg.f3 : numeric predictor; set to the value(s): 2717.01597051597. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.103923377. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): coronal. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-f01. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.f.baseline.schwa.plot <- plot_smooth(R.f.baseline.mod.AR, view="measurement.no", plot_all="decade", 
            cond=list(stress="schwa"), rm.ranef=T, n.grid=100)$fv
Predictor decade is not a factor.
Summary:
    * stress : factor; set to the value(s): schwa. 
    * avg.f3 : numeric predictor; set to the value(s): 2717.01597051597. 
    * measurement.no : numeric predictor; with 100 values ranging from 0.000000 to 10.000000. 
    * decade : numeric predictor; with 4 values ranging from 1970.000000 to 2000.000000. 
    * duration : numeric predictor; set to the value(s): 0.103923377. 
    * preceding.front : numeric predictor; set to the value(s): 1. 
    * foll.broad.f3 : factor; set to the value(s): coronal. (Might be canceled as random effect, check below.) 
    * speaker : factor; set to the value(s): 00-O-f01. (Might be canceled as random effect, check below.) 
    * word : factor; set to the value(s): were. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(measurement.no,foll.broad.f3),s(measurement.no,speaker),s(measurement.no,word)
 

R.f.baseline.plot <- rbind(R.f.baseline.full.plot, R.f.baseline.schwa.plot)
R.f.baseline.plot$decade <- factor(R.f.baseline.plot$decade, levels=c("1970","1980","1990","2000"))
# creating graph
ggplot(R.f.baseline.plot, aes(x=measurement.no, y=fit, group=decade, col=decade, lty=decade)) +
  geom_line(lwd=1) +
  facet_grid(.~stress) +
  geom_ribbon(aes(ymin=ll, ymax=ul, group=decade), col=NA,col="grey", alpha=0.1) +
  scale_color_manual(name="decade of\nrecording", values=c("orange","darkorange3","deepskyblue1","deepskyblue4")) +
  scale_linetype_discrete(name="decade of\nrecording") +
  scale_x_continuous(name="measurement point", limits = c(0, 10), breaks=seq(0,10,2)) +
  scale_y_continuous(name="F3 (Hz)", limits=c(2000, 3050)) +
  theme_bw() +
  theme(axis.title = element_text(size=14), 
        axis.text = element_text(size=12),
        legend.title = element_text(size=14, face="bold"),
        legend.text=element_text(size=12),
        plot.title=element_text(size=14, face="bold"),
        panel.grid=element_blank(),
        strip.text=element_text(size=12)) +
  ggtitle("F3 changes for /r/ in females (controlling for baseline F3)")
Duplicated aesthetics after name standardisation: colour

#ggsave("graphs/r_female_f3_change_control.pdf", width=8, height=4)
LS0tCnRpdGxlOiBBbmFseXNlcyBmb3IgYFZvaWNlIHF1YWxpdHkgYW5kIGNvZGEgL3IvIGluIEdsYXNnb3cgRW5nbGlzaCBpbiB0aGUgZWFybHkgMjB0aAogIGNlbnR1cnknCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KClRoaXMgUi1tYXJrZG93biBmaWxlIHByZXNlbnRzIGFsbCBhbmFseXNlcyBmb3Igb3VyIHBhcGVyIHRpdGxlZCAiVm9pY2UgcXVhbGl0eSBhbmQgY29kYSAvci8gaW4gR2xhc2dvdyBFbmdsaXNoIGluIHRoZSBlYXJseSAyMHRoIGNlbnR1cnkiLiBUaGUgYW5hbHlzZXMgYXJlIHByZXNlbnRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFyZSBpbiB0aGUgcGFwZXIsIGFuZCB0aGUgc2VjdGlvbiBudW1iZXJpbmcgYWxzbyBmb2xsb3dzIG91ciBwYXBlciAod2hpY2ggbWVhbnMgdGhhdCBpdCBhY3R1YWxseSBzdGFydHMgYXQgNC4xLCB3aGljaCBpcyB0aGUgZmlyc3QgcmVzdWx0cyBzZWN0aW9uIGluIHRoZSBwYXBlcikuCgpXZSBzdGFydCBieSBpbXBvcnRpbmcgYWxsIHJlbGV2YW50IGxpYnJhcmllcyBhbmQgdGhlIGRhdGEuIFRoZSBkZXRhaWxzIG9mIHRoZSBkYXRhIHByb2Nlc3NpbmcgKGUuZy4gZXhjbHVzaW9uIG9mIG91dGxpZXJzKSBhcmUgc2hvd24gaW4gYSBzZXBhcmF0ZSBmaWxlIHRpdGxlZCAqZGF0YV9wcmVwLlJtZCouCgpMZXQncyBpbXBvcnQgdGhlIGRhdGEgYW5kIHJlbGV2YW50IGxpYnJhcmllcyBmaXJzdC4gTm90ZSB0aGF0IHdlIGhhdmUgc2F2ZWQgb3VyIHN0YXRpc3RpY2FsIG1vZGVscyBhcyBSRFMgZmlsZXMsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBzYXZlIHRpbWUgYnkgbm90IGhhdmluZyB0byByZWZpdCB0aGVtIChzb21lIG9mIG91ciBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMgbWF5IHRha2UgYmV0d2VlbiAxMCBtaW51dGVzIHRvIGFuIGhvdXIgdG8gZml0KS4gVGhlIHVzZXIgaGFzIHRoZSBvcHRpb24gb2YgcmUtZml0dGluZyBhbGwgbW9kZWxzIGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgKnJlZml0X3BsZWFzZSogdmFyaWFibGUgdG8gVFJVRSBiZWxvdy4KCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobWdjdikKbGlicmFyeShpdHNhZHVnKQpsaWJyYXJ5KHJtcykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShlZmZlY3RzKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoYWZleCkKCnJlZml0X3BsZWFzZSA8LSBGICMgcGxlYXNlIGRvbid0IHJlZml0IGFsbCB0aGUgbW9kZWxzIC0ganVzdCBsb2FkIHRoZW0gZnJvbSBSRFMgZmlsZXMKCiMgdm93ZWwgZGF0YQp2b3dlbHMgPC0gcmVhZF9jc3YoImRhdGEvdm93ZWxzLmNzdiIpCiMgZm9ybWF0dGluZyBmb3IgbWl4ZWQgZWZmZWN0cyBtb2RlbHMKdm93ZWxzJFNwZWFrZXIgPC0gYXMuZmFjdG9yKHZvd2VscyRTcGVha2VyKQp2b3dlbHMkVGFyZ2V0Lm9ydGhvZ3JhcGh5IDwtIGFzLmZhY3Rvcih2b3dlbHMkVGFyZ2V0Lm9ydGhvZ3JhcGh5KQp2b3dlbHMkdm93ZWwgPC0gYXMuZmFjdG9yKHZvd2VscyR2b3dlbCkKdm93ZWxzJGRlY2FkZSA8LSBpZmVsc2Uodm93ZWxzJGRlY2FkZT09IjAwIiwgMjAwMCwgYXMubnVtZXJpYyh2b3dlbHMkZGVjYWRlKSArIDE5MDApCnZvd2VscyRkZWNhZGUuZmFjdCA8LSBmYWN0b3Iodm93ZWxzJGRlY2FkZS5mYWN0LCBsZXZlbHM9YygiNzAiLCI4MCIsIjkwIiwiMDAiKSkKCgojIC9yLyBkYXRhCgpSIDwtIHJlYWRfY3N2KCJkYXRhL1IuY3N2IikgIyBGL00gY29uZnVzZSByZWFkX2Nzdi4uLgpjb2x0eXBzIDwtIHNwZWMoUikKY29sdHlwcyRjb2xzJGdlbmRlciA8LSBjb2xfY2hhcmFjdGVyKCkKIyBhbmQgYWdhaW4hClIgPC0gcmVhZF9jc3YoImRhdGEvUi5jc3YiLCBjb2xfdHlwZXM9Y29sdHlwcykKCiMgc29tZSBjaGFuZ2VzIHRvIHZhcmlhYmxlcyB0byBtYWtlIHRoZW0gd29yayB3aXRoIEdBTU1zClIgPC0gUiAlPiUKICBtdXRhdGUoc3RyZXNzID0gYXMub3JkZXJlZChzdHJlc3MpLAogICAgICAgICBzdGFydC5ldmVudCA9IChtZWFzdXJlbWVudC5ubz09MCksCiAgICAgICAgIGZvbGwuYnJvYWQuZjMgPSBhcy5mYWN0b3IoZm9sbC5icm9hZC5mMyksCiAgICAgICAgIHNwZWFrZXIgPSBhcy5mYWN0b3Ioc3BlYWtlciksCiAgICAgICAgIHdvcmQgPSBhcy5mYWN0b3Iod29yZCkpCmNvbnRyYXN0cyhSJHN0cmVzcykgPC0gImNvbnRyLnRyZWF0bWVudCIKCiMgc2VwYXJhdGUgZGF0YSBzZXRzIGZvciBtYWxlcyBhbmQgZmVtYWxlcwpSLm0gPC0gUiAlPiUKICBmaWx0ZXIoZ2VuZGVyPT0iTSIpClIuZiA8LSBSICU+JQogIGZpbHRlcihnZW5kZXI9PSJGIikKCiMgc2V0dGluZyB1cCB2YXJpYWJsZXMgZm9yIGFuYWx5c2lzIHZpYSBHQU1NcwpSJHRyYW5zLmJyb2FkIDwtIHJlY29kZShSJHRyYW5zLCB3YT0iYSIpClIkdHJhbnMuYnJvYWQuZmFjdCA8LSBhcy5vcmRlcmVkKFIkdHJhbnMuYnJvYWQpCmNvbnRyYXN0cyhSJHRyYW5zLmJyb2FkLmZhY3QpIDwtICJjb250ci50cmVhdG1lbnQiClIkZ2VuZGVyLm9yZGVyZWQgPC0gYXMub3JkZXJlZChSJGdlbmRlcikKY29udHJhc3RzKFIkZ2VuZGVyLm9yZGVyZWQpIDwtICJjb250ci50cmVhdG1lbnQiCgoKIyBhdWRpdG9yeSBSIGRhdGEgLS0gY3JlYXRlIGRhdGEgc2V0IHdpdGggdW5pcXVlIHJlYWxpc2F0aW9ucwpSLmF1ZCA8LSBSWyEoUiR0cmFucyAlaW4lIGMoIiIsICI/ciIpKSAmIFIkbWVhc3VyZW1lbnQubm89PTAsXQojIG9ubHkgYSBmZXcgd2Vha2VuZWQgYXBwcm94aW1hbnRzLCBzbyBmb2xkIHRoZXNlIGludG8gb3RoZXIgY2F0ZWdvcmllcwpSLmF1ZCA8LSBSICU+JQogIGZpbHRlcighKHRyYW5zICVpbiUgYygiIiwgIj9yIikpLCAKICAgICAgICAgIWlzLm5hKHRyYW5zKSwKICAgICAgICAgbWVhc3VyZW1lbnQubm89PTApICU+JQogIG11dGF0ZSh0cmFucy5icm9hZD1yZWNvZGUodHJhbnMsIHdhPSJhIiksCiAgICAgICAgIGdlbmRlcj1yZWNvZGUoZ2VuZGVyLCBNPSJtYWxlIiwgYEZgPSJmZW1hbGUiKSkKCiMgYXVkaXRvcnkgdm9pY2UgcXVhbGl0eSBkYXRhCiMgZ2V0dGluZyBmMyBhdmdzCmF2Zy5mMyA8LSB1bmlxdWUoc2VsZWN0KFIsIHNwZWFrZXIsIGF2Zy5mMykpCiMgcmVhZGluZyAmIGZvcm1hdHRpbmcgZGF0YQpSLnZxIDwtIHJlYWRfY3N2KCJkYXRhL2F1ZGl0b3J5dnEuY3N2IikgJT4lCiAgcmVuYW1lKHNwZWFrZXI9InNwZWFrZXIgY29kZSIsCiAgICAgICAgIGFkdmFuY2VkLnRpcC5ibGFkZT0iYWR2YW5jZWQgdGlwL2JsYWRlIiwKICAgICAgICAgdG9uZ3VlLmJvZHkuaGVpZ2h0PSJ0b25ndWUgYm9keSBoZWlnaHQiLAogICAgICAgICB0b25ndWUuYm9keS5mcm9udC5iYWNrbmVzcz0idG9uZ3VlIGJvZHkgZnJvbnQtYmFja25lc3MiKSAlPiUKICAjIGpvaW4gd2l0aCBhdmcuZjMhCiAgaW5uZXJfam9pbihhdmcuZjMsIGJ5PSJzcGVha2VyIikgJT4lCiAgbXV0YXRlKGdlbmRlcj1hcy5mYWN0b3IoaWZlbHNlKCFpcy5uYShzdHJfbWF0Y2goc3BlYWtlciwgIi1tMCIpKSwgIm1hbGUiLCAiZmVtYWxlIikpLAogICAgICAgICBkZWNhZGU9dW5saXN0KHN1YnN0cihzcGVha2VyLCAxLCAyKSksCiAgICAgICAgIGRlY2FkZT1hcy5udW1lcmljKHJlY29kZShkZWNhZGUsIGAwMGA9IjEwMCIpKSArIDE5MDApCgpgYGAKCiMjIDQuMTogQ2hhbmdlcyB0byBjb2RhIC9yLyAtLSBUYWtlIDE6IEFjb3VzdGljIHJlc3VsdHMKCiMgTWFsZXMgd2l0aG91dCBiYXNlbGluZSBjb250cm9sCgpBbmFseXNpbmcgbWFsZXMgZmlyc3QsIG5vdCBjb250cm9sbGluZyBmb3IgYmFzZWxpbmUgRjMuIEZpdHRpbmcgdGhyZWUgbW9kZWxzOgoKLSBtb2RlbCB3aXRob3V0IEFSIGZvciBlc3RpbWF0aW5nIHJobyAoc28gdGhhdCBhdXRvY29ycmVsYXRpb24gY2FuIGJlIGhhbmRsZWQgY29ycmVjdGx5KQotIGZ1bGwgbW9kZWwgd2l0aCBBUgotIG5lc3RlZCBtb2RlbCB3aXRoIEFSIChyaG8gZnJvbSBmdWxsIG1vZGVsKQoKYGBge3J9CmlmIChyZWZpdF9wbGVhc2UpIHsKICAjIG1vZGVsIHdpdGhvdXQgQVIKICBzeXN0ZW0udGltZSgKICAgIFIubS5tb2Qubm8uQVIgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyByYW5kb20gc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGZvbGwuYnJvYWQuZjMsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgc3BlYWtlciwgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCB3b3JkLCBicz0iZnMiLCBtPTEsIGs9NCksCiAgICAgICAgICAgICAgICAgICAgICBkYXQ9Ui5tKQogICkKICAjIHNhdmVSRFMoUi5tLm1vZC5uby5BUiwgIm1vZGVscy9SLm0ubW9kLm5vLkFSIikKICAKICAjIGV4dHJhY3RpbmcgZW1waXJpY2FsIHZhbHVlIG9mIGF1dG9jb3JyZWxhdGlvbiBhdCBsYWcgMQogIFIubS5yaG8gPC0gc3RhcnRfdmFsdWVfcmhvKFIubS5tb2Qubm8uQVIpCiAgCiAgIyBmdWxsIG1vZGVsIHdpdGggQVIKICBzeXN0ZW0udGltZSgKICAgIFIubS5tb2QuQVIgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyByYW5kb20gc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGZvbGwuYnJvYWQuZjMsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgc3BlYWtlciwgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCB3b3JkLCBicz0iZnMiLCBtPTEsIGs9NCksCiAgICAgICAgICAgICAgICAgICAgICBkYXQ9Ui5tLCBtZXRob2Q9Ik1MIiwKICAgICAgICAgICAgICAgICAgICAgIEFSLnN0YXJ0PVIubSRzdGFydC5ldmVudCwgcmhvPVIubS5yaG8pCiAgKQogICMgc2F2ZVJEUyhSLm0ubW9kLkFSLCAibW9kZWxzL1IubS5tb2QuQVIiKQogIAogIHN1bW1hcnkoUi5tLm1vZC5BUikKICAKICAjIG5lc3RlZCBtb2RlbCB3aXRoIEFSCiAgc3lzdGVtLnRpbWUoCiAgICBSLm0ubW9kLkFSLm1pbi5kZWNhZGUgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3MoZGVjYWRlLCBrPTQsIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogMmQgc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0ucmhvKQogICkKIyBzYXZlUkRTKFIubS5tb2QuQVIubWluLmRlY2FkZSwgIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5kZWNhZGUiKQp9CgpSLm0ubW9kLkFSIDwtIHJlYWRSRFMoIm1vZGVscy9SLm0ubW9kLkFSIikKUi5tLm1vZC5BUi5taW4uZGVjYWRlIDwtIHJlYWRSRFMoIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5kZWNhZGUiKQoKY29tcGFyZU1MKFIubS5tb2QuQVIsIFIubS5tb2QuQVIubWluLmRlY2FkZSkgIyBzaWduaWZpY2FudCBvdmVyYWxsIGVmZmVjdCBvZiBkZWNhZGUKYGBgCgpGdXJ0aGVyIHF1ZXN0aW9ucyAob25seSBmaXJzdCB0d28gb2YgdGhlc2UgZGlzY3Vzc2VkIGluIHBhcGVyKToKCi0gb3ZlcmFsbCBlZmZlY3Qgb2Ygc3RyZXNzPwotIHNpZ25pZmljYW50IGNoYW5nZSBpbiBzaGFwZT8KLSBkbyB1bnN0cmVzc2VkIC8gc3RyZXNzZWQgc3lsbGFibGVzIHNob3cgZGlmZmVyZW50IGNoYW5nZXM/CiAgLSBkaWZmZXJlbnQgc2hhcGUgY2hhbmdlPwogIC0gZGlmZmVyZW50IG92ZXJhbGwgY2hhbmdlPwoKYGBge3J9CmlmIChyZWZpdF9wbGVhc2UpIHsKCiAgIyBvdmVyYWxsIHN0cmVzcz8KCiAgc3lzdGVtLnRpbWUoCiAgICBSLm0ubW9kLkFSLm1pbi5zdHJlc3MgPC0gYmFtKGYzIH4gI3N0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3MobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0ucmhvKQogICkKICAjIHNhdmVSRFMoUi5tLm1vZC5BUi5taW4uc3RyZXNzLCAibW9kZWxzL1IubS5tb2QuQVIubWluLnN0cmVzcyIpCgogICMgc2hhcGUgY2hhbmdlPwoKICBzeXN0ZW0udGltZSgKICAgIFIubS5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQsIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogMmQgc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0ucmhvKQogICkKICAjIHNhdmVSRFMoUi5tLm1vZC5BUi5taW4uZGVjYWRlLnNoYXBlLCAibW9kZWxzL1IubS5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSIpCgogICMgb3ZlcmFsbCBzdHJlc3MgeCBkZWNhZGU/CgogIHN5c3RlbS50aW1lKAogICAgUi5tLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcyA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0ucmhvKQogICkKICAjIHNhdmVSRFMoUi5tLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcywgIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzIikKICAKICAjIHNoYXBlIHN0cmVzcyB4IGRlY2FkZT8KICAKICBzeXN0ZW0udGltZSgKICAgIFIubS5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3Muc2hhcGUgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0ucmhvKQogICkKICAjIHNhdmVSRFMoUi5tLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcy5zaGFwZSwgIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIikKfQogIAoKUi5tLm1vZC5BUi5taW4uc3RyZXNzIDwtIHJlYWRSRFMoIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5zdHJlc3MiKQpSLm0ubW9kLkFSLm1pbi5kZWNhZGUuc2hhcGUgPC0gcmVhZFJEUygibW9kZWxzL1IubS5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSIpClIubS5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3MgPC0gcmVhZFJEUygibW9kZWxzL1IubS5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3MiKQpSLm0ubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIDwtIHJlYWRSRFMoIm1vZGVscy9SLm0ubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIikKIyBvdmVyYWxsIHN0cmVzcz8KY29tcGFyZU1MKFIubS5tb2QuQVIsIFIubS5tb2QuQVIubWluLnN0cmVzcywgc3VnZ2VzdC5yZXBvcnQ9VCkgIyBub24tc2lnCiMgc2hhcGUgY2hhbmdlPwpjb21wYXJlTUwoUi5tLm1vZC5BUiwgUi5tLm1vZC5BUi5taW4uZGVjYWRlLnNoYXBlLCBzdWdnZXN0LnJlcG9ydD1UKSAjIG5vbi1zaWcKIyBvdmVyYWxsIHN0cmVzcyB4IGRlY2FkZT8KY29tcGFyZU1MKFIubS5tb2QuQVIsIFIubS5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3MsIHN1Z2dlc3QucmVwb3J0PVQpICMgbm9uLXNpZwojIHNoYXBlIHN0cmVzcyB4IGRlY2FkZT8KY29tcGFyZU1MKFIubS5tb2QuQVIsIFIubS5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3Muc2hhcGUpICMgbm9uLXNpZwpgYGAKCkNyZWF0aW5nIGZpZ3VyZSAyIGJvdHRvbSBwYW5lbCBzaG93aW5nIHRoZSBtb2RlbCBwcmVkaWN0aW9ucyBmb3IgbWFsZXMuCgpgYGB7cn0KIyBleHRyYWN0aW5nIG1vZGVsIHByZWRpY3Rpb25zICh1c2luZyBwbG90X3Ntb290aCBmcm9tIGl0c2FkdWcpClIubS5mdWxsLnBsb3QgPC0gcGxvdF9zbW9vdGgoUi5tLm1vZC5BUiwgdmlldz0ibWVhc3VyZW1lbnQubm8iLCBwbG90X2FsbD0iZGVjYWRlIiwgCiAgICAgICAgICAgIGNvbmQ9bGlzdChzdHJlc3M9ImZ1bGwiKSwgcm0ucmFuZWY9VCwgbi5ncmlkPTEwMCkkZnYKUi5tLnNjaHdhLnBsb3QgPC0gcGxvdF9zbW9vdGgoUi5tLm1vZC5BUiwgdmlldz0ibWVhc3VyZW1lbnQubm8iLCBwbG90X2FsbD0iZGVjYWRlIiwgCiAgICAgICAgICAgIGNvbmQ9bGlzdChzdHJlc3M9InNjaHdhIiksIHJtLnJhbmVmPVQsIG4uZ3JpZD0xMDApJGZ2ClIubS5wbG90IDwtIHJiaW5kKFIubS5mdWxsLnBsb3QsIFIubS5zY2h3YS5wbG90KQoKIyBmb3JtYXR0aW5nIGRlY2FkZSBwcmVkaWN0b3IKUi5tLnBsb3QkZGVjYWRlIDwtIGZhY3RvcihSLm0ucGxvdCRkZWNhZGUsIGxldmVscz1jKCIxOTcwIiwiMTk4MCIsIjE5OTAiLCIyMDAwIikpCgojIGNyZWF0aW5nIHRoZSBwbG90CmdncGxvdChSLm0ucGxvdCwgYWVzKHg9bWVhc3VyZW1lbnQubm8sIHk9Zml0LCBncm91cD1kZWNhZGUsIGNvbD1kZWNhZGUsIGx0eT1kZWNhZGUpKSArCiAgZ2VvbV9saW5lKGx3ZD0xKSArCiAgZmFjZXRfZ3JpZCgufnN0cmVzcykgKwogIGdlb21fcmliYm9uKGFlcyh5bWluPWxsLCB5bWF4PXVsLCBncm91cD1kZWNhZGUpLCBjb2w9TkEsY29sPSJncmV5IiwgYWxwaGE9MC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJvcmFuZ2UiLCJkYXJrb3JhbmdlMyIsImRlZXBza3libHVlMSIsImRlZXBza3libHVlNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJkZWNhZGUgb2ZcbnJlY29yZGluZyIpICsKICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShuYW1lPSJkZWNhZGUgb2ZcbnJlY29yZGluZyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ibWVhc3VyZW1lbnQgcG9pbnQiLCBsaW1pdHMgPSBjKDAsIDEwKSwgYnJlYWtzPXNlcSgwLDEwLDIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkYzIChIeikiLCBsaW1pdHM9YygyMDAwLCAzMDUwKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksIAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpICsKICBnZ3RpdGxlKCJGMyBjaGFuZ2VzIGZvciAvci8gaW4gbWFsZXMgKG5vdCBjb250cm9sbGluZyBmb3IgYmFzZWxpbmUgRjMpIikKI2dnc2F2ZSgiZ3JhcGhzL3JfbWFsZV9mM19jaGFuZ2Vfbm9fY29udHJvbC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9NCkKYGBgCgoKCiMgRmVtYWxlcyB3aXRob3V0IGJhc2VsaW5lIGNvbnRyb2wKCkFuYWx5c2luZyBmZW1hbGVzLCBub3QgY29udHJvbGxpbmcgZm9yIGJhc2VsaW5lIEYzLiBGaXR0aW5nIHRocmVlIG1vZGVsczoKCi0gbW9kZWwgd2l0aG91dCBBUiBmb3IgZXN0aW1hdGluZyByaG8gKHNvIHRoYXQgYXV0b2NvcnJlbGF0aW9uIGNhbiBiZSBoYW5kbGVkIGNvcnJlY3RseSkKLSBmdWxsIG1vZGVsIHdpdGggQVIKLSBuZXN0ZWQgbW9kZWwgd2l0aCBBUiAocmhvIGZyb20gZnVsbCBtb2RlbCkKCmBgYHtyfQppZiAocmVmaXRfcGxlYXNlKSB7CiAgIyBtb2RlbCB3aXRob3V0IEFSCiAgc3lzdGVtLnRpbWUoCiAgICBSLmYubW9kLm5vLkFSIDwtIGJhbShmMyB+IHN0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiAyZCBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZikKICApCiAgIyBzYXZlUkRTKFIuZi5tb2Qubm8uQVIsICJtb2RlbHMvUi5mLm1vZC5uby5BUiIpCiAgCiAgIyBleHRyYWN0aW5nIGVtcGlyaWNhbCB2YWx1ZSBvZiBhdXRvY29ycmVsYXRpb24gYXQgbGFnIDEKICBSLmYucmhvIDwtIHN0YXJ0X3ZhbHVlX3JobyhSLmYubW9kLm5vLkFSKQogIAogICMgZnVsbCBtb2RlbCB3aXRoIEFSCiAgc3lzdGVtLnRpbWUoCiAgICBSLmYubW9kLkFSIDwtIGJhbShmMyB+IHN0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiAyZCBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZiwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLmYkc3RhcnQuZXZlbnQsIHJobz1SLmYucmhvKQogICkKICAjIHNhdmVSRFMoUi5mLm1vZC5BUiwgIm1vZGVscy9SLmYubW9kLkFSIikKICAKICBzdW1tYXJ5KFIuZi5tb2QuQVIpCiAgCiAgIyBuZXN0ZWQgbW9kZWwgd2l0aCBBUgogIHN5c3RlbS50aW1lKAogICAgUi5mLm1vZC5BUi5taW4uZGVjYWRlIDwtIGJhbShmMyB+IHN0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICAjcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICAjdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICAjdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgZm9sbC5icm9hZC5mMywgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBzcGVha2VyLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHdvcmQsIGJzPSJmcyIsIG09MSwgaz00KSwKICAgICAgICAgICAgICAgICAgICAgIGRhdD1SLmYsIG1ldGhvZD0iTUwiLAogICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9Ui5mJHN0YXJ0LmV2ZW50LCByaG89Ui5mLnJobykKICApCiAgIyBzYXZlUkRTKFIuZi5tb2QuQVIubWluLmRlY2FkZSwgIm1vZGVscy9SLmYubW9kLkFSLm1pbi5kZWNhZGUiKQp9CgpSLmYubW9kLkFSIDwtIHJlYWRSRFMoIm1vZGVscy9SLmYubW9kLkFSIikKUi5mLm1vZC5BUi5taW4uZGVjYWRlIDwtIHJlYWRSRFMoIm1vZGVscy9SLmYubW9kLkFSLm1pbi5kZWNhZGUiKQoKY29tcGFyZU1MKFIuZi5tb2QuQVIsIFIuZi5tb2QuQVIubWluLmRlY2FkZSkgIyBzaWduaWZpY2FudCBvdmVyYWxsIGVmZmVjdCBvZiBkZWNhZGUKYGBgCgpGdXJ0aGVyIHF1ZXN0aW9ucyAob25seSBmaXJzdCB0d28gb2YgdGhlc2UgZGlzY3Vzc2VkIGluIHBhcGVyKToKCi0gb3ZlcmFsbCBlZmZlY3Qgb2Ygc3RyZXNzPwotIHNpZ25pZmljYW50IGNoYW5nZSBpbiBzaGFwZT8KLSBkbyB1bnN0cmVzc2VkIC8gc3RyZXNzZWQgc3lsbGFibGVzIHNob3cgZGlmZmVyZW50IGNoYW5nZXM/CiAgLSBkaWZmZXJlbnQgc2hhcGUgY2hhbmdlPwogIC0gZGlmZmVyZW50IG92ZXJhbGwgY2hhbmdlPwoKYGBge3J9CmlmIChyZWZpdF9wbGVhc2UpIHsKCiAgIyBvdmVyYWxsIHN0cmVzcz8KCiAgc3lzdGVtLnRpbWUoCiAgICBSLmYubW9kLkFSLm1pbi5zdHJlc3MgPC0gYmFtKGYzIH4gI3N0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3MobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZiwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLmYkc3RhcnQuZXZlbnQsIHJobz1SLmYucmhvKQogICkKICAjIHNhdmVSRFMoUi5mLm1vZC5BUi5taW4uc3RyZXNzLCAibW9kZWxzL1IuZi5tb2QuQVIubWluLnN0cmVzcyIpCgogICMgc2hhcGUgY2hhbmdlPwoKICBzeXN0ZW0udGltZSgKICAgIFIuZi5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQsIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogMmQgc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZiwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLmYkc3RhcnQuZXZlbnQsIHJobz1SLmYucmhvKQogICkKICAjIHNhdmVSRFMoUi5mLm1vZC5BUi5taW4uZGVjYWRlLnNoYXBlLCAibW9kZWxzL1IuZi5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSIpCgogICMgb3ZlcmFsbCBzdHJlc3MgeCBkZWNhZGU/CgogIHN5c3RlbS50aW1lKAogICAgUi5mLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcyA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZiwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLmYkc3RhcnQuZXZlbnQsIHJobz1SLmYucmhvKQogICkKICAjIHNhdmVSRFMoUi5mLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcywgIm1vZGVscy9SLmYubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzIikKICAKICAjIHNoYXBlIHN0cmVzcyB4IGRlY2FkZT8KICAKICBzeXN0ZW0udGltZSgKICAgIFIuZi5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3Muc2hhcGUgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgICN0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIuZiwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLmYkc3RhcnQuZXZlbnQsIHJobz1SLmYucmhvKQogICkKICAjIHNhdmVSRFMoUi5mLm1vZC5BUi5taW4uZGVjYWRlLnN0cmVzcy5zaGFwZSwgIm1vZGVscy9SLmYubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIikKfQogIAoKUi5mLm1vZC5BUi5taW4uc3RyZXNzIDwtIHJlYWRSRFMoIm1vZGVscy9SLmYubW9kLkFSLm1pbi5zdHJlc3MiKQpSLmYubW9kLkFSLm1pbi5kZWNhZGUuc2hhcGUgPC0gcmVhZFJEUygibW9kZWxzL1IuZi5tb2QuQVIubWluLmRlY2FkZS5zaGFwZSIpClIuZi5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3MgPC0gcmVhZFJEUygibW9kZWxzL1IuZi5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3MiKQpSLmYubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIDwtIHJlYWRSRFMoIm1vZGVscy9SLmYubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLnNoYXBlIikKIyBvdmVyYWxsIHN0cmVzcz8KY29tcGFyZU1MKFIuZi5tb2QuQVIsIFIuZi5tb2QuQVIubWluLnN0cmVzcywgc3VnZ2VzdC5yZXBvcnQ9VCkgIyBzaWcKIyBzaGFwZSBjaGFuZ2U/CmNvbXBhcmVNTChSLmYubW9kLkFSLCBSLmYubW9kLkFSLm1pbi5kZWNhZGUuc2hhcGUsIHN1Z2dlc3QucmVwb3J0PVQpICMgc2lnCiMgb3ZlcmFsbCBzdHJlc3MgeCBkZWNhZGU/CmNvbXBhcmVNTChSLmYubW9kLkFSLCBSLmYubW9kLkFSLm1pbi5kZWNhZGUuc3RyZXNzLCBzdWdnZXN0LnJlcG9ydD1UKSAjIHNpZwojIHNoYXBlIHN0cmVzcyB4IGRlY2FkZT8KY29tcGFyZU1MKFIuZi5tb2QuQVIsIFIuZi5tb2QuQVIubWluLmRlY2FkZS5zdHJlc3Muc2hhcGUpICMgc2lnCmBgYAoKQ3JlYXRpbmcgZmlndXJlIDIgdG9wIHBhbmVsIHNob3dpbmcgdGhlIG1vZGVsIHByZWRpY3Rpb25zIGZvciBmZW1hbGVzLgoKYGBge3J9CiMgZXh0cmFjdGluZyBtb2RlbCBwcmVkaWN0aW9ucyAodXNpbmcgcGxvdF9zbW9vdGggZnJvbSBpdHNhZHVnKQpSLmYuZnVsbC5wbG90IDwtIHBsb3Rfc21vb3RoKFIuZi5tb2QuQVIsIHZpZXc9Im1lYXN1cmVtZW50Lm5vIiwgcGxvdF9hbGw9ImRlY2FkZSIsIAogICAgICAgICAgICBjb25kPWxpc3Qoc3RyZXNzPSJmdWxsIiksIHJtLnJhbmVmPVQsIG4uZ3JpZD0xMDApJGZ2ClIuZi5zY2h3YS5wbG90IDwtIHBsb3Rfc21vb3RoKFIuZi5tb2QuQVIsIHZpZXc9Im1lYXN1cmVtZW50Lm5vIiwgcGxvdF9hbGw9ImRlY2FkZSIsIAogICAgICAgICAgICBjb25kPWxpc3Qoc3RyZXNzPSJzY2h3YSIpLCBybS5yYW5lZj1ULCBuLmdyaWQ9MTAwKSRmdgpSLmYucGxvdCA8LSByYmluZChSLmYuZnVsbC5wbG90LCBSLmYuc2Nod2EucGxvdCkKCiMgZm9ybWF0dGluZyBkZWNhZGUgcHJlZGljdG9yClIuZi5wbG90JGRlY2FkZSA8LSBmYWN0b3IoUi5mLnBsb3QkZGVjYWRlLCBsZXZlbHM9YygiMTk3MCIsIjE5ODAiLCIxOTkwIiwiMjAwMCIpKQogIAojIGNyZWF0aW5nIHBsb3QKZ2dwbG90KFIuZi5wbG90LCBhZXMoeD1tZWFzdXJlbWVudC5ubywgeT1maXQsIGdyb3VwPWRlY2FkZSwgY29sPWRlY2FkZSwgbHR5PWRlY2FkZSkpICsKICBnZW9tX2xpbmUobHdkPTEpICsKICBmYWNldF9ncmlkKC5+c3RyZXNzKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bGwsIHltYXg9dWwsIGdyb3VwPWRlY2FkZSksIGNvbD1OQSxjb2w9ImdyZXkiLCBhbHBoYT0wLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT0iZGVjYWRlIG9mXG5yZWNvcmRpbmciLCB2YWx1ZXM9Yygib3JhbmdlIiwiZGFya29yYW5nZTMiLCJkZWVwc2t5Ymx1ZTEiLCJkZWVwc2t5Ymx1ZTQiKSkgKwogIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKG5hbWU9ImRlY2FkZSBvZlxucmVjb3JkaW5nIikgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJtZWFzdXJlbWVudCBwb2ludCIsIGxpbWl0cyA9IGMoMCwgMTApLCBicmVha3M9c2VxKDAsMTAsMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iRjMgKEh6KSIsIGxpbWl0cz1jKDIwMDAsIDMwNTApKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwgCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIGdndGl0bGUoIkYzIGNoYW5nZXMgZm9yIC9yLyBpbiBmZW1hbGVzIChub3QgY29udHJvbGxpbmcgZm9yIGJhc2VsaW5lIEYzKSIpCiNnZ3NhdmUoImdyYXBocy9yX2ZlbWFsZV9mM19jaGFuZ2Vfbm9fY29udHJvbC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9NCkKYGBgCgoKIyMgNC4yOiBDaGFuZ2VzIHRvIGNvZGEgL3IvIC0tIFRha2UgMTogQXVkaXRvcnkgcmVzdWx0cwoKRmlyc3QsIHdlIGZpdCBvdXIgbW9kZWwgb2YgZHluYW1pYyBGMyBtZWFzdXJlbWVudHMgYXMgYSBmdW5jdGlvbiBvZiAvci8tcmVhbGlzYXRpb24sIHdob3NlIHByZWRpY3Rpb25zIGFyZSBwbG90dGVkIGluIGZpZ3VyZSAzLgoKYGBge3J9CgppZiAocmVmaXRfcGxlYXNlKSB7CgogICMgbW9kZWwgd2l0aG91dCBBUgogIHN5c3RlbS50aW1lKAogICAgUi5zaGFwZXMubW9kLm5vLkFSIDwtIGJhbShmMyB+IHN0cmVzcyArIHRyYW5zLmJyb2FkLmZhY3QgKyBnZW5kZXIgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9dHJhbnMuYnJvYWQuZmFjdCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PWdlbmRlcikgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogMmQgc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBwcmVjZWRpbmcuZnJvbnQsIGs9YygxMCwzKSkgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIpCiAgKQogICNzYXZlUkRTKFIuc2hhcGVzLm1vZC5uby5BUiwgIm1vZGVscy9SLnNoYXBlcy5tb2Qubm8uQVIiKQogIAogICMgZXh0cmFjdGluZyBlbXBpcmljYWwgYXV0b2NvcnJlbGF0aW9uIHZhbHVlIGF0IGxhZyAxCiAgUi5zaGFwZXMucmhvIDwtIHN0YXJ0X3ZhbHVlX3JobyhSLnNoYXBlcy5tb2Qubm8uQVIpCiAgIyBzZXR0aW5nIHVwIHN0YXJ0LmV2ZW50IGZvciB1c2Ugd2l0aCBBUjEKICBSJHN0YXJ0LmV2ZW50IDwtIFIkbWVhc3VyZW1lbnQubm8gPT0gMAogIAogICMgZnVsbCBtb2RlbCB3aXRoIEFSCiAgc3lzdGVtLnRpbWUoCiAgICBSLnNoYXBlcy5tb2QuQVIgICA8LSBiYW0oZjMgfiBzdHJlc3MgKyB0cmFucy5icm9hZC5mYWN0ICsgZ2VuZGVyICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXRyYW5zLmJyb2FkLmZhY3QpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1nZW5kZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgZm9sbC5icm9hZC5mMywgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBzcGVha2VyLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHdvcmQsIGJzPSJmcyIsIG09MSwgaz00KSwKICAgICAgICAgICAgICAgICAgICAgIGRhdD1SLAogICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9UiRzdGFydC5ldmVudCwgcmhvPVIuc2hhcGVzLnJobywKICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0iTUwiKQogICkKICAjc2F2ZVJEUyhSLnNoYXBlcy5tb2QuQVIsICJtb2RlbHMvUi5zaGFwZXMubW9kLkFSIikKICAKICBzdW1tYXJ5KFIuc2hhcGVzLm1vZC5BUikKICAKICAjIG5lc3RlZCBtb2RlbAogIHN5c3RlbS50aW1lKAogICAgUi5zaGFwZXMubW9kLkFSLm1pbi50cmFucyAgIDwtIGJhbShmMyB+IHN0cmVzcyArIGdlbmRlciArICMgdHJhbnMuYnJvYWQuZmFjdCArIAogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3MobWVhc3VyZW1lbnQubm8sIGJ5PXRyYW5zLmJyb2FkLmZhY3QpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1nZW5kZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgZm9sbC5icm9hZC5mMywgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBzcGVha2VyLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHdvcmQsIGJzPSJmcyIsIG09MSwgaz00KSwKICAgICAgICAgICAgICAgICAgICAgIGRhdD1SLAogICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9UiRzdGFydC5ldmVudCwgcmhvPVIuc2hhcGVzLnJobywKICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0iTUwiKQogICkKICAjc2F2ZVJEUyhSLnNoYXBlcy5tb2QuQVIubWluLnRyYW5zLCAibW9kZWxzL1Iuc2hhcGVzLm1vZC5BUi5taW4udHJhbnMiKQp9CgpSLnNoYXBlcy5tb2QuQVIgPC0gcmVhZFJEUygibW9kZWxzL1Iuc2hhcGVzLm1vZC5BUiIpClIuc2hhcGVzLm1vZC5BUi5taW4udHJhbnMgPC0gcmVhZFJEUygibW9kZWxzL1Iuc2hhcGVzLm1vZC5BUi5taW4udHJhbnMiKQoKY29tcGFyZU1MKFIuc2hhcGVzLm1vZC5BUiwgUi5zaGFwZXMubW9kLkFSLm1pbi50cmFucykKYGBgCgpOb3cgY3JlYXRpbmcgZmlndXJlIDMuCgpgYGB7cn0KIyBleHRyYWN0aW5nIG1vZGVsIHByZWRpY3Rpb25zClIuc2hhcGVzIDwtIHBsb3Rfc21vb3RoKFIuc2hhcGVzLm1vZC5BUiwgdmlldz0ibWVhc3VyZW1lbnQubm8iLCBwbG90X2FsbD0idHJhbnMuYnJvYWQuZmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQ9bGlzdChnZW5kZXI9IkYiKSwgcm0ucmFuZWY9VCwgcnVnPUYpW1sxXV0KCiMgcmVsZXZlbGluZywgbWVhbmluZ2Z1bCBuYW1lcyBmb3IgcmVhbGlzYXRpb25zClIuc2hhcGVzJHRyYW5zLmJyb2FkLmZhY3QgPC0gZmFjdG9yKFIuc2hhcGVzJHRyYW5zLmJyb2FkLmZhY3QsIGxldmVscz1jKCJvIiwiaSIsInd0IiwiYSIsInQiLCJyIikpClIuc2hhcGVzIDwtIFIuc2hhcGVzICU+JSAKICBtdXRhdGUocmVhbGlzYXRpb249cmVjb2RlKHRyYW5zLmJyb2FkLmZhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvPSJ6ZXJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9ImludGVybWVkaWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dD0id2Vha2VuZWQgdGFwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE9ImFwcHJveGltYW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9ImZ1bGwgdGFwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI9InRyaWxsIiksCiAgICAgICAgIHJlYWxpc2F0aW9uPWZhY3RvcihyZWFsaXNhdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiemVybyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJtZWRpYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrZW5lZCB0YXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcHJveGltYW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdWxsIHRhcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJpbGwiKSkKICApCiMgZXhjbHVkaW5nIHRyaWxscwpSLnNoYXBlcyA8LSBmaWx0ZXIoUi5zaGFwZXMsIHRyYW5zLmJyb2FkLmZhY3QgIT0gInIiKQoKIyBjcmVhdGluZyBncmFwaApnZ3Bsb3QoUi5zaGFwZXMsIGFlcyh4PW1lYXN1cmVtZW50Lm5vLCB5PWZpdCwgY29sPXJlYWxpc2F0aW9uLCBsdHk9cmVhbGlzYXRpb24pKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bGwsIHltYXg9dWwsIGdyb3VwPXRyYW5zLmJyb2FkLmZhY3QpLCBhbHBoYT0wLjA1LCBjb2xvdXI9TkEpICsKICBnZW9tX2xpbmUobHdkPTEpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygzLDQsMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwxKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iL3IvIHJlYWxpc2F0aW9uIikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygib3JhbmdlIiwiZGFya29yYW5nZTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcmtvcmFuZ2UzIiwiZGVlcHNreWJsdWUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWVwc2t5Ymx1ZTMiKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ii9yLyByZWFsaXNhdGlvbiIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ibWVhc3VyZW1lbnQgcG9pbnQiLCBsaW1pdHMgPSBjKDAsIDEwKSwgYnJlYWtzPXNlcSgwLDEwLDIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkYzIChIeikiLCBsaW1pdHM9YygyNDUwLDI5NTApKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwgCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIGdndGl0bGUoIkFjb3VzdGljIGNvcnJlbGF0ZXMgb2YgZGlmZmVyZW50IC9yLyByZWFsaXNhdGlvbnMgaW4gRjMiKQojZ2dzYXZlKCJncmFwaHMvcl9hY291c3RpY19jb3JyZWxhdGVzLnBkZiIsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCldlIG5vdyBjcmVhdGUgZmlndXJlIDQsIHRoYXQgaXMsIHRoZSBwcm9wb3J0aW9ucyBvZiBkaWZmZXJlbnQgcmVhbGlzYXRpb25zIGFzIGEgZnVuY3Rpb24gb2YgdGltZS4KCmBgYHtyfQojIGNhbGN1bGF0aW5nIHByb3BvcnRpb25zClIucHJvcHMuZGVjIDwtIFIuYXVkICU+JSAKICBjb3VudChkZWNhZGUsIGdlbmRlciwgdHJhbnMuYnJvYWQpICU+JSAKICBncm91cF9ieShkZWNhZGUsIGdlbmRlcikgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lCiAgdW5ncm91cCgpCgojIHJlbGV2ZWxpbmcKUi5wcm9wcy5kZWMkdHJhbnMuYnJvYWQgPC0gZmFjdG9yKFIucHJvcHMuZGVjJHRyYW5zLmJyb2FkLCBsZXZlbHM9YygibyIsImkiLCJ3dCIsImEiLCJ0IiwiciIpKQoKIyBjcmVhdGluZyB0aGUgZ3JhcGgKZ2dwbG90KFIucHJvcHMuZGVjLCBhZXMoeD1kZWNhZGUsIGZpbGw9dHJhbnMuYnJvYWQpKSArIAogIGdlb21fYmFyKGFlcyh5PXByb3ApLCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIpICsgCiAgZmFjZXRfd3JhcCh+Z2VuZGVyKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIm9yYW5nZSIsImRhcmtvcmFuZ2UxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXJrb3JhbmdlMyIsImRlZXBza3libHVlMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVlcHNreWJsdWUzIiwiZGVlcHNreWJsdWU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ii9yLyByZWFsaXNhdGlvbiIsIAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJ6ZXJvIiwiaW50ZXJtZWRpYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2Vha2VuZWQgdGFwIiwiYXBwcm94aW1hbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXAiLCJ0cmlsbCIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCwgbmFtZT0icGVyY2VudGFnZSBvZiByZWFsaXNhdGlvbnMiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiZGVjYWRlIG9mIHJlY29yZGluZyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCAKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCmdndGl0bGUoIkNoYW5nZXMgaW4gcHJvcG9ydGlvbnMgb2YgYXVkaXRvcnkgL3IvIHZhcmlhbnRzIikKI2dnc2F2ZSgiZ3JhcGhzL3JfYXVkaXRvcnkucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTQpCmBgYAoKV2Ugbm93IHJ1biB0aGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbHMgd2hvc2UgcmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIHBhcGVyLgoKYGBge3J9CiMgY3JlYXRpbmcgYSBzdHJlbmd0aCBvZiAvci8gdmFyaWFibGUgYW5kIGEgcHJlc2VuY2Ugb2YgL3IvIHZhcmlhYmxlIChib3RoIGJpbmFyeSkKUi5hdWQgPC0gbXV0YXRlKFIuYXVkLCByLnN0cmVuZ3RoPXJlY29kZSh0cmFucy5icm9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9InN0cm9uZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE9InN0cm9uZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI9InN0cm9uZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0PSJ3ZWFrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0id2VhayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG89IndlYWsiKSwKICAgICAgICAgICAgICAgICAgICAgICByLnByZXNlbmNlPXJlY29kZSh0cmFucy5icm9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9InByZXNlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhPSJwcmVzZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcj0icHJlc2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0PSJwcmVzZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0iZGVsZXRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG89ImRlbGV0ZWQiKSAKICAgICAgICAgICAgICAgICkKUi5hdWQkci5zdHJlbmd0aCA8LSBmYWN0b3IoUi5hdWQkci5zdHJlbmd0aCwgbGV2ZWxzPWMoIndlYWsiLCJzdHJvbmciKSkKUi5hdWQkci5wcmVzZW5jZSA8LSBmYWN0b3IoUi5hdWQkci5wcmVzZW5jZSwgbGV2ZWxzPWMoImRlbGV0ZWQiLCJwcmVzZW50IikpCgppZiAocmVmaXRfcGxlYXNlKSB7CiAgIyBub3RlIHRoZSBhYnNlbmNlIG9mIHJhbmRvbSBzbG9wZXMgb3ZlciBkZWNhZGUgYnkgd29yZCAobm90IHBvc3NpYmxlIHRvIGluY2x1ZGUgZHVlIHRvIG5vbi1jb252ZXJnZW5jZSkKICAjIGZ1bGwgbW9kZWwgZm9yIHN0cmVuZ3RoCiAgci5zdHIubW9kIDwtIGdsbWVyKHIuc3RyZW5ndGggfiBzY2FsZShkZWNhZGUpICogZ2VuZGVyICsgc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHNwZWFrZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHdvcmQpLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPVIuYXVkLAogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9ImJpbm9taWFsIikKICAjc2F2ZVJEUyhyLnN0ci5tb2QsICJtb2RlbHMvci5zdHIubW9kIikKICAKICAjIG5lc3RlZCBtb2RlbCBmb3Igc3RyZW5ndGgKICByLnN0ci5tb2QubWluLmRlY2FkZSA8LSBnbG1lcihyLnN0cmVuZ3RoIH4gZ2VuZGVyICsgc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHNwZWFrZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHdvcmQpLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPVIuYXVkLAogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9ImJpbm9taWFsIikKICAjc2F2ZVJEUyhyLnN0ci5tb2QubWluLmRlY2FkZSwgIm1vZGVscy9yLnN0ci5tb2QubWluLmRlY2FkZSIpCiAgCiAgIyBub3RlIHRoZSBhYnNlbmNlIG9mIHJhbmRvbSBzbG9wZXMgb3ZlciBkZWNhZGUgYnkgd29yZCAobm90IHBvc3NpYmxlIHRvIGluY2x1ZGUgZHVlIHRvIG5vbi1jb252ZXJnZW5jZSkKICAjIGZ1bGwgbW9kZWwgZm9yIC9yLyBwcmVzZW5jZQogIHIucHJlcy5tb2QgPC0gZ2xtZXIoci5wcmVzZW5jZSB+IHNjYWxlKGRlY2FkZSkgKiBnZW5kZXIgKyBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3BlYWtlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgd29yZCksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9Ui5hdWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT0iYmlub21pYWwiLAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sPWdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmw9bGlzdChtYXhmdW49MmU1KSkpCiAgI3NhdmVSRFMoci5wcmVzLm1vZCwgIm1vZGVscy9yLnByZXMubW9kIikKICAKICAjIG5lc3RlZCBtb2RlbCBmb3IgL3IvIHByZXNlbmNlCiAgci5wcmVzLm1vZC5taW4uZGVjYWRlIDwtIGdsbWVyKHIucHJlc2VuY2UgfiBnZW5kZXIgKyBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3BlYWtlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgd29yZCksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9Ui5hdWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT0iYmlub21pYWwiKQogICNzYXZlUkRTKHIucHJlcy5tb2QubWluLmRlY2FkZSwgIm1vZGVscy9yLnByZXMubW9kLm1pbi5kZWNhZGUiKQp9CgpyLnN0ci5tb2QgPC0gcmVhZFJEUygibW9kZWxzL3Iuc3RyLm1vZCIpCnIuc3RyLm1vZC5taW4uZGVjYWRlIDwtIHJlYWRSRFMoIm1vZGVscy9yLnN0ci5tb2QubWluLmRlY2FkZSIpCnIucHJlcy5tb2QgPC0gcmVhZFJEUygibW9kZWxzL3IucHJlcy5tb2QiKQpyLnByZXMubW9kLm1pbi5kZWNhZGUgPC0gcmVhZFJEUygibW9kZWxzL3IucHJlcy5tb2QubWluLmRlY2FkZSIpCgpzdW1tYXJ5KHIuc3RyLm1vZCkKc3VtbWFyeShyLnByZXMubW9kKQoKIyBtb2RlbCBjb21wYXJpc29ucyByZXBvcnRlZCBpbiBwYXBlcgphbm92YShyLnN0ci5tb2QsIHIuc3RyLm1vZC5taW4uZGVjYWRlLHRlc3Q9IkNoaXNxIikKYW5vdmEoci5wcmVzLm1vZCwgci5wcmVzLm1vZC5taW4uZGVjYWRlLHRlc3Q9IkNoaXNxIikKYGBgCgoKIyMgNS4xIEFjb3VzdGljIHJlc3VsdHMgZm9yIHZvaWNlIHF1YWxpdHkKCkZpcnN0IHNvbWUgcGxvdHMgc2hvd2luZyB0aGUgcmF3IGRhdGEgZm9yIEYxL0YyL0YzIGJyb2tlbiBkb3duIGJ5IHZvd2VscyAodGhlc2UgYXJlIGVzcGVjaWFsbHkgdXNlZnVsIGFzIHRoZXkgc2hvdyB0aGF0IGFsbCB2b3dlbHMgc2hvdyBhIHJpc2UgaW4gRjM5LgoKYGBge3J9CmdncGxvdCh2b3dlbHMsIGFlcyh4PWRlY2FkZS5mYWN0LCB5PWYxKSkgKwogIGZhY2V0X2dyaWQoZ2VuZGVyIH4gdm93ZWwpICsKICBnZW9tX2JveHBsb3QoKQpnZ3Bsb3Qodm93ZWxzLCBhZXMoeD1kZWNhZGUuZmFjdCwgeT1mMikpICsKICBmYWNldF9ncmlkKGdlbmRlciB+IHZvd2VsKSArCiAgZ2VvbV9ib3hwbG90KCkKZ2dwbG90KHZvd2VscywgYWVzKHg9ZGVjYWRlLmZhY3QsIHk9ZjMpKSArCiAgZmFjZXRfZ3JpZChnZW5kZXIgfiB2b3dlbCkgKwogIGdlb21fYm94cGxvdCgpCmBgYAoKIyBNb2RlbGxpbmcgRjEvRjIvRjMKCldlJ2xsIGZpdCBsaW5lYXIgbWl4ZWQgbW9kZWxzIHRvIEYxL0YyL0YzLCBydW5uaW5nIHRoZSBtb2RlbHMgaW4gc2VwYXJhdGUgUi1tYXJrZG93biBjaHVua3MuCgpGaXJzdCBGMToKCmBgYHtyLCBjYWNoZT1UfQojIHRoaXMgaXMgdGhlIG1vZGVsIHRoYXQgd2Ugd291bGQgbGlrZSB0byBoYXZlIC0gYnV0IGl0CiMgZG9lcyBub3QgY29udmVyZ2UgZHVlIHRvIGEgc2luZ3VsYXJpdHkgaW52b2x2aW5nIAojIHRoZSBkZWNhZGUgYnkgdm93ZWwgcmFuZG9tIHNsb3BlCgojIGYxLm1vZC5mdWxsIDwtIGxtZXIoZjEgfiBnZW5kZXIgKiBkZWNhZGUuZmFjdCArCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZShkdXJhdGlvbikgKwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIGRlY2FkZS5mYWN0IHwgdm93ZWwpICsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBUYXJnZXQub3J0aG9ncmFwaHkpICsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKIyAgICAgICAgICAgICAgIGRhdGE9dm93ZWxzLCBSRU1MPUYpCgojIHRoZXNlIGFyZSB0d28gYWx0ZXJuYXRpdmUgbW9kZWxzOyBtb2RlbCAxIGZvcmNlcyB0aGUgZGVjYWRlCiMgZWZmZWN0IHRvIGJlIGxpbmVhcgoKaWYgKHJlZml0X3BsZWFzZSkgewogIGYxLm1vZC5mdWxsLjEgPC0gbG1lcihmMSB+IGdlbmRlciAqIHNjYWxlKGRlY2FkZSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoZGVjYWRlKSB8IHZvd2VsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFRhcmdldC5vcnRob2dyYXBoeSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKICAgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQogICMgc2F2ZVJEUyhmMS5tb2QuZnVsbC4xLCAibW9kZWxzL2YxLm1vZC5mdWxsLjEiKQogIAogICMgbW9kZWwgMiBoYXMgbm8gYnktdm93ZWwgcmFuZG9tIHNsb3BlIGZvciBkZWNhZGUgKGJ1dCB0aGUgZGVjYWRlCiAgIyBlZmZlY3QgaXMgYWxsb3dlZCB0byBiZSBub24tbGluZWFyKQogIAogIGYxLm1vZC5mdWxsLjIgPC0gbG1lcihmMSB+IGdlbmRlciAqIGRlY2FkZS5mYWN0ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHZvd2VsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFRhcmdldC5vcnRob2dyYXBoeSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKICAgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQogICMgc2F2ZVJEUyhmMS5tb2QuZnVsbC4yLCAibW9kZWxzL2YxLm1vZC5mdWxsLjIiKQogIAogICMgbmVpdGhlciBtb2RlbCBzaG93cyBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiBkZWNhZGU6CiAgIyAoYW5kIG5vdGUgdGhhdCBtb2RlbCAyIGlzIGV4cGVjdGVkIHRvIGJlIGFudGktY29uc2VydmF0aXZlIHdpdGgKICAjICByZXNwZWN0IHRvIGRlY2FkZSEpCiAgCiAgZjEubW9kLmNvbXAuMSA8LSBsbWVyKGYxIH4gZ2VuZGVyICsgc2NhbGUoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoZGVjYWRlKSB8IHZvd2VsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFRhcmdldC5vcnRob2dyYXBoeSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKICAgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQogICMgc2F2ZVJEUyhmMS5tb2QuY29tcC4xLCAibW9kZWxzL2YxLm1vZC5jb21wLjEiKQogIGYxLm1vZC5jb21wLjIgPC0gbG1lcihmMSB+IGdlbmRlciArIHNjYWxlKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHZvd2VsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFRhcmdldC5vcnRob2dyYXBoeSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKICAgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQogICMgc2F2ZVJEUyhmMS5tb2QuY29tcC4yLCAibW9kZWxzL2YxLm1vZC5jb21wLjIiKQp9CgpmMS5tb2QuZnVsbC4xIDwtIHJlYWRSRFMoIm1vZGVscy9mMS5tb2QuZnVsbC4xIikKZjEubW9kLmZ1bGwuMiA8LSByZWFkUkRTKCJtb2RlbHMvZjEubW9kLmZ1bGwuMiIpCmYxLm1vZC5jb21wLjEgPC0gcmVhZFJEUygibW9kZWxzL2YxLm1vZC5jb21wLjEiKQpmMS5tb2QuY29tcC4yIDwtIHJlYWRSRFMoIm1vZGVscy9mMS5tb2QuY29tcC4yIikKYW5vdmEoZjEubW9kLmZ1bGwuMSwgZjEubW9kLmNvbXAuMSkgIyBub24tc2lnCmFub3ZhKGYxLm1vZC5mdWxsLjIsIGYxLm1vZC5jb21wLjIpICMgbm9uLXNpZwpgYGAKCkYxIGRvZXMgbm90IHNob3cgYSBzaWduaWZpY2FudCBjaGFuZ2UuCgpgYGB7ciwgY2FjaGU9VH0KIyB0aGlzIGlzIHRoZSBtb2RlbCB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSAtIGJ1dCBpdAojIGRvZXMgbm90IGNvbnZlcmdlIGR1ZSB0byBhIHNpbmd1bGFyaXR5IGludm9sdmluZyAKIyB0aGUgZGVjYWRlIGJ5IHZvd2VsIHJhbmRvbSBzbG9wZQoKIyBmMi5tb2QuZnVsbCA8LSBsbWVyKGYyIH4gZ2VuZGVyICogZGVjYWRlLmZhY3QgKwojICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUoZHVyYXRpb24pICsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBkZWNhZGUuZmFjdCB8IHZvd2VsKSArCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgVGFyZ2V0Lm9ydGhvZ3JhcGh5KSArCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgU3BlYWtlciksCiMgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQoKIyB0aGVzZSBhcmUgdHdvIGFsdGVybmF0aXZlIG1vZGVsczsgbW9kZWwgMSBmb3JjZXMgdGhlIGRlY2FkZQojIGVmZmVjdCB0byBiZSBsaW5lYXIKCmlmIChyZWZpdF9wbGVhc2UpIHsKICBmMi5tb2QuZnVsbC4xIDwtIGxtZXIoZjIgfiBnZW5kZXIgKiBzY2FsZShkZWNhZGUpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIHNjYWxlKGRlY2FkZSkgfCB2b3dlbCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBUYXJnZXQub3J0aG9ncmFwaHkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgU3BlYWtlciksCiAgICAgICAgICAgICAgICAgZGF0YT12b3dlbHMsIFJFTUw9RikKICAjIHNhdmVSRFMoZjIubW9kLmZ1bGwuMSwgIm1vZGVscy9mMi5tb2QuZnVsbC4xIikKICAKICAjIG1vZGVsIDIgaGFzIG5vIGJ5LXZvd2VsIHJhbmRvbSBzbG9wZSBmb3IgZGVjYWRlIChidXQgdGhlIGRlY2FkZQogICMgZWZmZWN0IGlzIGFsbG93ZWQgdG8gYmUgbm9uLWxpbmVhcikKICAKICBmMi5tb2QuZnVsbC4yIDwtIGxtZXIoZjIgfiBnZW5kZXIgKiBkZWNhZGUuZmFjdCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZShkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCB2b3dlbCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBUYXJnZXQub3J0aG9ncmFwaHkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgU3BlYWtlciksCiAgICAgICAgICAgICAgICAgZGF0YT12b3dlbHMsIFJFTUw9RikKICAjIHNhdmVSRFMoZjIubW9kLmZ1bGwuMiwgIm1vZGVscy9mMi5tb2QuZnVsbC4yIikKICAKICAjIG5laXRoZXIgbW9kZWwgc2hvd3MgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZGVjYWRlOgogICMgKGFuZCBub3RlIHRoYXQgbW9kZWwgMiBpcyBleHBlY3RlZCB0byBiZSBhbnRpLWNvbnNlcnZhdGl2ZSB3aXRoCiAgIyAgcmVzcGVjdCB0byBkZWNhZGUhKQogIAogIGYyLm1vZC5jb21wLjEgPC0gbG1lcihmMiB+IGdlbmRlciArIHNjYWxlKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIHNjYWxlKGRlY2FkZSkgfCB2b3dlbCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBUYXJnZXQub3J0aG9ncmFwaHkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgU3BlYWtlciksCiAgICAgICAgICAgICAgICAgZGF0YT12b3dlbHMsIFJFTUw9RikKICAjIHNhdmVSRFMoZjIubW9kLmNvbXAuMSwgIm1vZGVscy9mMi5tb2QuY29tcC4xIikKICBmMi5tb2QuY29tcC4yIDwtIGxtZXIoZjIgfiBnZW5kZXIgKyBzY2FsZShkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCB2b3dlbCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBUYXJnZXQub3J0aG9ncmFwaHkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgU3BlYWtlciksCiAgICAgICAgICAgICAgICAgZGF0YT12b3dlbHMsIFJFTUw9RikKICAjIHNhdmVSRFMoZjIubW9kLmNvbXAuMiwgIm1vZGVscy9mMi5tb2QuY29tcC4yIikKfQoKZjIubW9kLmZ1bGwuMSA8LSByZWFkUkRTKCJtb2RlbHMvZjIubW9kLmZ1bGwuMSIpCmYyLm1vZC5jb21wLjEgPC0gcmVhZFJEUygibW9kZWxzL2YyLm1vZC5jb21wLjEiKQpmMi5tb2QuZnVsbC4yIDwtIHJlYWRSRFMoIm1vZGVscy9mMi5tb2QuZnVsbC4yIikKZjIubW9kLmNvbXAuMiA8LSByZWFkUkRTKCJtb2RlbHMvZjIubW9kLmNvbXAuMiIpCgphbm92YShmMi5tb2QuZnVsbC4xLCBmMi5tb2QuY29tcC4xKSAjIG5vbi1zaWcKYW5vdmEoZjIubW9kLmZ1bGwuMiwgZjIubW9kLmNvbXAuMikgIyBub24tc2lnCmBgYAoKRjIgZG9lcyBub3Qgc2hvdyBhIHNpZ25pZmljYW50IGNoYW5nZS4KCk5vdyBmb3IgRjM6CgpgYGB7cn0KaWYgKHJlZml0X3BsZWFzZSkgewogIGYzLm1vZC5mdWxsIDwtIGxtZXIoZjMgfiBnZW5kZXIgKiBkZWNhZGUuZmFjdCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZShkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBkZWNhZGUuZmFjdCB8IHZvd2VsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFRhcmdldC5vcnRob2dyYXBoeSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBTcGVha2VyKSwKICAgICAgICAgICAgICAgICBkYXRhPXZvd2VscywgUkVNTD1GKQogICMgc2F2ZVJEUyhmMy5tb2QuZnVsbCwgIm1vZGVscy9mMy5tb2QuZnVsbCIpCiAgI3N1bW1hcnkoZjMubW9kLmZ1bGwpCiAgCiAgCiAgZjMubW9kLmNvbXAgPC0gbG1lcihmMyB+IGdlbmRlciArIHNjYWxlKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIGRlY2FkZS5mYWN0IHwgdm93ZWwpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgVGFyZ2V0Lm9ydGhvZ3JhcGh5KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IFNwZWFrZXIpLAogICAgICAgICAgICAgICAgIGRhdGE9dm93ZWxzLCBSRU1MPUYpCiAgIyBzYXZlUkRTKGYzLm1vZC5jb21wLCAibW9kZWxzL2YzLm1vZC5jb21wIikKfQoKZjMubW9kLmZ1bGwgPC0gcmVhZFJEUygibW9kZWxzL2YzLm1vZC5mdWxsIikKZjMubW9kLmNvbXAgPC0gcmVhZFJEUygibW9kZWxzL2YzLm1vZC5jb21wIikKCmFub3ZhKGYzLm1vZC5mdWxsLCBmMy5tb2QuY29tcCkKYGBgCgpGMyBjbGVhcmx5IHJpc2VzIHNpZ25pZmljYW50bHkgb3ZlciB0aW1lLiBQcmVkaWN0aW9uIHBsb3QgZm9yIHRoZSBwYXBlciwgaS5lLiBmaWd1cmUgNToKCmBgYHtyfQojIGV4dHJhY3RpbmcgcHJlZGljdGlvbnMgZnJvbSB0aGUgbW9kZWwKbmV3LmRhdCA8LSBleHBhbmQuZ3JpZChnZW5kZXI9dW5pcXVlKHZvd2VscyRnZW5kZXIpLAogICAgICAgICAgICAgICAgICAgICAgIGRlY2FkZS5mYWN0PWxldmVscyh2b3dlbHMkZGVjYWRlLmZhY3QpLAogICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uPW1lZGlhbih2b3dlbHMkZHVyYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgIHZvd2VsPXVuaXF1ZSh2b3dlbHMkdm93ZWwpWzFdKQpuZXcuZGF0JGYzIDwtIDAKbmV3LmRhdCRmMyA8LSBwcmVkaWN0KGYzLm1vZC5mdWxsLCBuZXcuZGF0LCByZS5mb3JtPU5BKQptbSA8LSBtb2RlbC5tYXRyaXgodGVybXMoZjMubW9kLmZ1bGwpLG5ldy5kYXQpICMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCnB2YXIxIDwtIGRpYWcobW0gJSolIHRjcm9zc3Byb2QodmNvdihmMy5tb2QuZnVsbCksbW0pKQoKbmV3LmRhdCA8LSBkYXRhLmZyYW1lKAogICAgbmV3LmRhdCwKICAgIGxvd2VyID0gbmV3LmRhdCRmMy0yKnNxcnQocHZhcjEpLAogICAgdXBwZXIgPSBuZXcuZGF0JGYzKzIqc3FydChwdmFyMSkKKQoKIyBjcmVhdGluZyB0aGUgZ3JhcGgKCm1lYW5fZnVuIDwtIGZ1bmN0aW9uKHgpewogIHJldHVybihkYXRhLmZyYW1lKHkgPSBtZWFuKHgpLCBsYWJlbCA9IHBhc3RlMCgiICAiLCByb3VuZChtZWFuKHgpKSwgIiBIeiIpKSkKfQoKZ2dwbG90KG5ldy5kYXQsIGFlcyh4PWRlY2FkZS5mYWN0LCB5PWYzLCBjb2w9Z2VuZGVyKSkgKwogIGdlb21fdmlvbGluKGRhdGE9dm93ZWxzLCBhZXMoZmlsbD1nZW5kZXIsIGNvbD1OQSksIGFscGhhPTAuMiwgc2hvdy5sZWdlbmQ9RikgKwogIGdlb21fcG9pbnQoc2l6ZT0yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sb3dlciwgeW1heD11cHBlciksIHdpZHRoPTAuMjUsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSkpICsKICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2Z1biwgZ2VvbSA9ICJ0ZXh0Iiwgc2l6ZT00LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpLCBoanVzdD0wLCBzaG93LmxlZ2VuZD1GKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9ImdlbmRlciIsYnJlYWtzPWMoIkYiLCJNIiksIGxhYmVscz1jKCJmZW1hbGUiLCAibWFsZSIpLCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImRlZXBza3libHVlNCIsIm9yYW5nZSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0iZ2VuZGVyIixicmVha3M9YygiRiIsIk0iKSwgbGFiZWxzPWMoImZlbWFsZSIsICJtYWxlIiksIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiZGVlcHNreWJsdWU0Iiwib3JhbmdlIiksIGd1aWRlPUYpICsKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9ImRlY2FkZSBvZiByZWNvcmRpbmciLCBsYWJlbHM9YygxOTcwLDE5ODAsMTk5MCwyMDAwKSwgZXhwYW5kPWV4cGFuZF9zY2FsZShhZGQ9YygwLjA1LDEpKSkgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJGMyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCAKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRjMgY2hhbmdlcyBmb3Igdm93ZWxzICh3aXRoIG1vZGVsIHByZWRpY3Rpb25zKSIpCiNnZ3NhdmUoImdyYXBocy92b3dlbHNfZjNfY2hhbmdlLnBkZiIsIHdpZHRoPTgsIGhlaWdodD00KQogIApgYGAKCgojIyA1LjIgQXVkaXRvcnkgcmVzdWx0cyBmb3Igdm9pY2UgcXVhbGl0eQoKV2UgZmlyc3QgZml0IGEgbW9kZWwgdGhhdCBzaG93cyBob3cgRjMgY29ycmVsYXRlcyB3aXRoIGRpZmZlcmVudCBhdWRpdG9yeSBtZWFzdXJlcwoKYGBge3J9CnZxLmYzLm1vZGVsIDwtIGxtKGF2Zy5mMyB+IGFkdmFuY2VkLnRpcC5ibGFkZSArIAogICAgICAgICAgICAgdG9uZ3VlLmJvZHkuaGVpZ2h0ICsgCiAgICAgICAgICAgICB0b25ndWUuYm9keS5mcm9udC5iYWNrbmVzcyArIAogICAgICAgICAgICAgZ2VuZGVyLCBkYXRhPVIudnEpCnN1bW1hcnkodnEuZjMubW9kZWwpCmBgYAoKV2UgdGhlbiBmaXQgdGhyZWUgc2VwYXJhdGUgbW9kZWxzICh3aXRoIGRlY2FkZSBjZW50cmVkIGFuZCBnZW5kZXIgc3VtIGNvZGVkKSB0byBjaGVjayBmb3IgZGVjYWRlIC8gZ2VuZGVyIGVmZmVjdHMgaW4gb3VyIHRocmVlIGF1ZGl0b3J5IG1lYXN1cmVzLgoKYGBge3J9CiMgY2VudHJpbmcgZGVjYWRlClIudnEkZGVjYWRlLmNlbnRyZWQgPC0gc2NhbGUoUi52cSRkZWNhZGUsIHNjYWxlPUYpCiMgc3VtIGNvZGluZyBnZW5kZXIKUi52cSRnZW5kZXIuc3VtIDwtIFIudnEkZ2VuZGVyCmNvbnRyYXN0cyhSLnZxJGdlbmRlci5zdW0pIDwtIGNvbnRyLnN1bSgyKQoKIyBmaXR0aW5nIGFuZCBzdW1tYXJpc2luZyBtb2RlbHMKc3VtbWFyeShsbSh0b25ndWUuYm9keS5oZWlnaHQgfiBkZWNhZGUuY2VudHJlZCArIGdlbmRlci5zdW0sIGRhdGE9Ui52cSkpCnN1bW1hcnkobG0odG9uZ3VlLmJvZHkuZnJvbnQuYmFja25lc3MgfiBkZWNhZGUuY2VudHJlZCArIGdlbmRlci5zdW0sIGRhdGE9Ui52cSkpCnN1bW1hcnkobG0oYWR2YW5jZWQudGlwLmJsYWRlIH4gZGVjYWRlLmNlbnRyZWQgKyBnZW5kZXIuc3VtLCBkYXRhPVIudnEpKQpgYGAKCkNyZWF0ZSBmaWd1cmUgNi4KCmBgYHtyfQojIGdldHRpbmcgY291bnRzIG9mIGRpZmZlcmVudCB0b25ndWUgYm9keSBoZWlnaHQgdmFsdWVzIHBlciBkZWNhZGUKUi52cS5jb3VudCA8LSBkcGx5cjo6Y291bnQoUi52cSwgdG9uZ3VlLmJvZHkuaGVpZ2h0LCBkZWNhZGUpCiMgYXJyYW5naW5nIGJ5IGRlY2FkZSAvIHRvbmd1ZSBib2R5IGhlaWdodApSLnZxLm9yZGVyZWQgPC0gUi52cSAlPiUgCiAgYXJyYW5nZShkZWNhZGUsIHRvbmd1ZS5ib2R5LmhlaWdodCkKCiMgY3JlYXRpbmcgZ3JhcGgKZ2dwbG90KFIudnEub3JkZXJlZCwgYWVzKHg9ZmFjdG9yKGRlY2FkZSksIHk9dG9uZ3VlLmJvZHkuaGVpZ2h0KSkgKwogIGdlb21fcG9pbnQoeD0xLHk9MSwgYWVzKGNvbG91cj0iRmVtYWxlIikpICsgIyB0aGlzIGlzIGEgaGFjayBmb3IgZ2V0dGluZyB0aGUgbGVnZW5kIHJpZ2h0IAogIGdlb21fcG9pbnQoeD0xLHk9MSwgYWVzKGNvbG91cj0iTWFsZSIpKSArICMgdGhpcyBpcyBhIGhhY2sgZm9yIGdldHRpbmcgdGhlIGxlZ2VuZCByaWdodCAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT0iR2VuZGVyIiwgdmFsdWVzPWMoImRlZXBza3libHVlNCIsIm9yYW5nZSIpLCBicmVha3M9YygiRmVtYWxlIiwiTWFsZSIpKSArCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLCBzdGFja2Rpcj0iY2VudGVyIiwgYmlucG9zaXRpb25zPSJhbGwiLAogICAgICAgICAgICAgICBmaWxsPWlmZWxzZShSLnZxLm9yZGVyZWQkZ2VuZGVyPT0iZmVtYWxlIiwgImRlZXBza3libHVlNCIsIm9yYW5nZSIpLAogICAgICAgICAgICAgICBjb2w9TkEsIGRvdHNpemU9MS41KSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGZ1bi55bWluPW1lYW4sIGZ1bi55bWF4PW1lYW4sIGdlb209ImNyb3NzYmFyIiwgYWVzKGdyb3VwPWRlY2FkZSksIHdpZHRoPTAuNCwgY29sPSJncmV5IikgKwogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iRGVjYWRlIG9mIHJlY29yZGluZyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iVG9uZ3VlIGJvZHkgaGVpZ2h0IikgKwogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gNCkpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwgCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIGdndGl0bGUoIkNoYW5nZXMgaW4gdG9uZ3VlIGJvZHkgaGVpZ2h0IG92ZXIgdGltZSIpCiMgZ2dzYXZlKCJncmFwaHMvdG9uZ3VlX2JvZHlfaGVpZ2h0LnBkZiIsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCiMjIENoYW5nZXMgdG8gQ29kYSBSOiB0YWtlIDIgLS0gYWNvdXN0aWMgYW5hbHlzaXMKCiMgTWFsZXMsIHRha2UgMiAod2l0aCBiYXNlbGluZSBjb250cm9sKQoKU2FtZSBtb2RlbGxpbmcgc3RyYXRlZ3kgYXMgYWJvdmUuCgpgYGB7cn0KaWYgKHJlZml0X3BsZWFzZSkgewogICMgbW9kZWwgd2l0aG91dCBBUgogIHN5c3RlbS50aW1lKAogICAgUi5tLmJhc2VsaW5lLm1vZC5uby5BUiA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGF2Zy5mMyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiAyZCBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSkKICApCiAgIyBzYXZlUkRTKFIubS5iYXNlbGluZS5tb2Qubm8uQVIsICJtb2RlbHMvUi5tLmJhc2VsaW5lLm1vZC5uby5BUiIpCiAgCiAgIyBleHRyYWN0aW5nIGVtcGlyaWNhbCBhdXRvY29ycmVsYXRpb24gdmFsdWVzIGF0IGxhZyAxCiAgUi5tLmJhc2VsaW5lLnJobyA8LSBzdGFydF92YWx1ZV9yaG8oUi5tLmJhc2VsaW5lLm1vZC5uby5BUikKICAKICAjIGZ1bGwgbW9kZWwgd2l0aCBBUgogIHN5c3RlbS50aW1lKAogICAgUi5tLmJhc2VsaW5lLm1vZC5BUiA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGF2Zy5mMyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMocHJlY2VkaW5nLmZyb250LCBrPTMpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiAyZCBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCksIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgcmFuZG9tIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBmb2xsLmJyb2FkLmYzLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHNwZWFrZXIsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgd29yZCwgYnM9ImZzIiwgbT0xLCBrPTQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0PVIubSwgbWV0aG9kPSJNTCIsCiAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1SLm0kc3RhcnQuZXZlbnQsIHJobz1SLm0uYmFzZWxpbmUucmhvKQogICkKICAjIHNhdmVSRFMoUi5tLmJhc2VsaW5lLm1vZC5BUiwgIm1vZGVscy9SLm0uYmFzZWxpbmUubW9kLkFSIikKICAKICBzdW1tYXJ5KFIubS5iYXNlbGluZS5tb2QuQVIpCiAgCiAgIyBuZXN0ZWQgbW9kZWwKICBzeXN0ZW0udGltZSgKICAgIFIubS5iYXNlbGluZS5tb2QuQVIubWluLmRlY2FkZSA8LSBiYW0oZjMgfiBzdHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGF2Zy5mMyArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAxIHNtb290aCB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8pICsKICAgICAgICAgICAgICAgICAgICAgICAgICAjcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICNzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICAjdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIHByZWNlZGluZy5mcm9udCwgaz1jKDEwLDMpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAzOiAyZCBzbW9vdGggYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICAjdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgZm9sbC5icm9hZC5mMywgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBzcGVha2VyLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHdvcmQsIGJzPSJmcyIsIG09MSwgaz00KSwKICAgICAgICAgICAgICAgICAgICAgIGRhdD1SLm0sIG1ldGhvZD0iTUwiLAogICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9Ui5tJHN0YXJ0LmV2ZW50LCByaG89Ui5tLmJhc2VsaW5lLnJobykKICApCiMgc2F2ZVJEUyhSLm0uYmFzZWxpbmUubW9kLkFSLm1pbi5kZWNhZGUsICJtb2RlbHMvUi5tLmJhc2VsaW5lLm1vZC5BUi5taW4uZGVjYWRlIikKfQoKUi5tLmJhc2VsaW5lLm1vZC5BUiA8LSByZWFkUkRTKCJtb2RlbHMvUi5tLmJhc2VsaW5lLm1vZC5BUiIpClIubS5iYXNlbGluZS5tb2QuQVIubWluLmRlY2FkZSA8LSByZWFkUkRTKCJtb2RlbHMvUi5tLmJhc2VsaW5lLm1vZC5BUi5taW4uZGVjYWRlIikKCmNvbXBhcmVNTChSLm0uYmFzZWxpbmUubW9kLkFSLCBSLm0uYmFzZWxpbmUubW9kLkFSLm1pbi5kZWNhZGUpCmBgYAoKQ3JlYXRpbmcgdGhlIGJvdHRvbSBwYW5lbCBvZiBmaWd1cmUgNy4KCmBgYHtyfQojIGV4dHJhY3RpbmcgcHJlZGljdGlvbnMsIGZvcm1hdHRpbmcgZGVjYWRlClIubS5iYXNlbGluZS5mdWxsLnBsb3QgPC0gcGxvdF9zbW9vdGgoUi5tLmJhc2VsaW5lLm1vZC5BUiwgdmlldz0ibWVhc3VyZW1lbnQubm8iLCBwbG90X2FsbD0iZGVjYWRlIiwgCiAgICAgICAgICAgIGNvbmQ9bGlzdChzdHJlc3M9ImZ1bGwiKSwgcm0ucmFuZWY9VCwgbi5ncmlkPTEwMCkkZnYKUi5tLmJhc2VsaW5lLnNjaHdhLnBsb3QgPC0gcGxvdF9zbW9vdGgoUi5tLmJhc2VsaW5lLm1vZC5BUiwgdmlldz0ibWVhc3VyZW1lbnQubm8iLCBwbG90X2FsbD0iZGVjYWRlIiwgCiAgICAgICAgICAgIGNvbmQ9bGlzdChzdHJlc3M9InNjaHdhIiksIHJtLnJhbmVmPVQsIG4uZ3JpZD0xMDApJGZ2ClIubS5iYXNlbGluZS5wbG90IDwtIHJiaW5kKFIubS5iYXNlbGluZS5mdWxsLnBsb3QsIFIubS5iYXNlbGluZS5zY2h3YS5wbG90KQpSLm0uYmFzZWxpbmUucGxvdCRkZWNhZGUgPC0gZmFjdG9yKFIubS5iYXNlbGluZS5wbG90JGRlY2FkZSwgbGV2ZWxzPWMoIjE5NzAiLCIxOTgwIiwiMTk5MCIsIjIwMDAiKSkKCiMgY3JlYXRlIGdyYXBoCmdncGxvdChSLm0uYmFzZWxpbmUucGxvdCwgYWVzKHg9bWVhc3VyZW1lbnQubm8sIHk9Zml0LCBncm91cD1kZWNhZGUsIGNvbD1kZWNhZGUsIGx0eT1kZWNhZGUpKSArCiAgZ2VvbV9saW5lKGx3ZD0xKSArCiAgZmFjZXRfZ3JpZCgufnN0cmVzcykgKwogIGdlb21fcmliYm9uKGFlcyh5bWluPWxsLCB5bWF4PXVsLCBncm91cD1kZWNhZGUpLCBjb2w9TkEsY29sPSJncmV5IiwgYWxwaGE9MC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9ImRlY2FkZSBvZlxucmVjb3JkaW5nIiwgdmFsdWVzPWMoIm9yYW5nZSIsImRhcmtvcmFuZ2UzIiwiZGVlcHNreWJsdWUxIiwiZGVlcHNreWJsdWU0IikpICsKICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShuYW1lPSJkZWNhZGUgb2ZcbnJlY29yZGluZyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ibWVhc3VyZW1lbnQgcG9pbnQiLCBsaW1pdHMgPSBjKDAsIDEwKSwgYnJlYWtzPXNlcSgwLDEwLDIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkYzIChIeikiLCBsaW1pdHM9YygyMDAwLCAzMDUwKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksIAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpICsKICBnZ3RpdGxlKCJGMyBjaGFuZ2VzIGZvciAvci8gaW4gbWFsZXMgKGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZSBGMykiKQojZ2dzYXZlKCJncmFwaHMvcl9tYWxlX2YzX2NoYW5nZV9jb250cm9sLnBkZiIsIHdpZHRoPTgsIGhlaWdodD00KQpgYGAKCiMgRmVtYWxlcywgdGFrZSAyICh3aXRoIGJhc2VsaW5lIGNvbnRyb2wpCgpTYW1lIG1vZGVsbGluZyBzdHJhdGVneSBhcyBhYm92ZS4KCmBgYHtyfQppZiAocmVmaXRfcGxlYXNlKSB7CiAgIyBtb2RlbCB3aXRob3V0IEFSCiAgc3lzdGVtLnRpbWUoCiAgICBSLmYuYmFzZWxpbmUubW9kLm5vLkFSIDwtIGJhbShmMyB+IHN0cmVzcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnLmYzICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDEgc21vb3RoIHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRlY2FkZSwgaz00LCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDI6IDJkIHNtb290aHMKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZGVjYWRlLCBrPWMoMTAsNCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aShtZWFzdXJlbWVudC5ubywgcHJlY2VkaW5nLmZyb250LCBrPWMoMTAsMykpICsKICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVsIDM6IDJkIHNtb290aCBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyByYW5kb20gc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGZvbGwuYnJvYWQuZjMsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgc3BlYWtlciwgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCB3b3JkLCBicz0iZnMiLCBtPTEsIGs9NCksCiAgICAgICAgICAgICAgICAgICAgICBkYXQ9Ui5mKQogICkKICAjIHNhdmVSRFMoUi5mLmJhc2VsaW5lLm1vZC5uby5BUiwgIm1vZGVscy9SLmYuYmFzZWxpbmUubW9kLm5vLkFSIikKICAKICAjIGV4dHJhY3RpbmcgZW1waXJpY2FsIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZSBhdCBsYWcgMQogIFIuZi5iYXNlbGluZS5yaG8gPC0gc3RhcnRfdmFsdWVfcmhvKFIuZi5iYXNlbGluZS5tb2Qubm8uQVIpCiAgCiAgIyBmdWxsIG1vZGVsIHdpdGggQVIKICBzeXN0ZW0udGltZSgKICAgIFIuZi5iYXNlbGluZS5tb2QuQVIgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcuZjMgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhkZWNhZGUsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZHVyYXRpb24pICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKHByZWNlZGluZy5mcm9udCwgaz0zKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiBieSB0ZXJtcwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMoZGVjYWRlLCBrPTQsIGJ5PXN0cmVzcykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogMmQgc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBwcmVjZWRpbmcuZnJvbnQsIGs9YygxMCwzKSkgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMzogMmQgc21vb3RoIGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGkobWVhc3VyZW1lbnQubm8sIGRlY2FkZSwgaz1jKDEwLDQpLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgZm9sbC5icm9hZC5mMywgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBzcGVha2VyLCBicz0iZnMiLCBtPTEsIGs9NCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIHdvcmQsIGJzPSJmcyIsIG09MSwgaz00KSwKICAgICAgICAgICAgICAgICAgICAgIGRhdD1SLmYsIG1ldGhvZD0iTUwiLAogICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9Ui5mJHN0YXJ0LmV2ZW50LCByaG89Ui5mLmJhc2VsaW5lLnJobykKICApCiAgIyBzYXZlUkRTKFIuZi5iYXNlbGluZS5tb2QuQVIsICJtb2RlbHMvUi5mLmJhc2VsaW5lLm1vZC5BUiIpCiAgCiAgc3VtbWFyeShSLmYuYmFzZWxpbmUubW9kLkFSKQogIAogICMgbmVzdGVkIG1vZGVsCiAgc3lzdGVtLnRpbWUoCiAgICBSLmYuYmFzZWxpbmUubW9kLkFSLm1pbi5kZWNhZGUgPC0gYmFtKGYzIH4gc3RyZXNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcuZjMgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMSBzbW9vdGggdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3MoZGVjYWRlLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKGR1cmF0aW9uKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhwcmVjZWRpbmcuZnJvbnQsIGs9MykgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMjogYnkgdGVybXMKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCBieT1zdHJlc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAjcyhkZWNhZGUsIGs9NCwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCAyOiAyZCBzbW9vdGhzCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3RpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBkdXJhdGlvbikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRpKG1lYXN1cmVtZW50Lm5vLCBwcmVjZWRpbmcuZnJvbnQsIGs9YygxMCwzKSkgKwogICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgMzogMmQgc21vb3RoIGJ5IHRlcm1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgI3RpKG1lYXN1cmVtZW50Lm5vLCBkZWNhZGUsIGs9YygxMCw0KSwgYnk9c3RyZXNzKSArCiAgICAgICAgICAgICAgICAgICAgICAgIyByYW5kb20gc21vb3RocwogICAgICAgICAgICAgICAgICAgICAgICAgIHMobWVhc3VyZW1lbnQubm8sIGZvbGwuYnJvYWQuZjMsIGJzPSJmcyIsIG09MSwgaz00KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcyhtZWFzdXJlbWVudC5ubywgc3BlYWtlciwgYnM9ImZzIiwgbT0xLCBrPTQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzKG1lYXN1cmVtZW50Lm5vLCB3b3JkLCBicz0iZnMiLCBtPTEsIGs9NCksCiAgICAgICAgICAgICAgICAgICAgICBkYXQ9Ui5mLCBtZXRob2Q9Ik1MIiwKICAgICAgICAgICAgICAgICAgICAgIEFSLnN0YXJ0PVIuZiRzdGFydC5ldmVudCwgcmhvPVIuZi5iYXNlbGluZS5yaG8pCiAgKQogICMgc2F2ZVJEUyhSLmYuYmFzZWxpbmUubW9kLkFSLm1pbi5kZWNhZGUsICJtb2RlbHMvUi5mLmJhc2VsaW5lLm1vZC5BUi5taW4uZGVjYWRlIikKfQoKUi5mLmJhc2VsaW5lLm1vZC5BUiA8LSByZWFkUkRTKCJtb2RlbHMvUi5mLmJhc2VsaW5lLm1vZC5BUiIpClIuZi5iYXNlbGluZS5tb2QuQVIubWluLmRlY2FkZSA8LSByZWFkUkRTKCJtb2RlbHMvUi5mLmJhc2VsaW5lLm1vZC5BUi5taW4uZGVjYWRlIikKCmNvbXBhcmVNTChSLmYuYmFzZWxpbmUubW9kLkFSLCBSLmYuYmFzZWxpbmUubW9kLkFSLm1pbi5kZWNhZGUpCmBgYAoKQ3JlYXRpbmcgdGhlIHRvcCBwYW5lbCBvZiBmaWd1cmUgNy4KCmBgYHtyfQpSLmYuYmFzZWxpbmUuZnVsbC5wbG90IDwtIHBsb3Rfc21vb3RoKFIuZi5iYXNlbGluZS5tb2QuQVIsIHZpZXc9Im1lYXN1cmVtZW50Lm5vIiwgcGxvdF9hbGw9ImRlY2FkZSIsIAogICAgICAgICAgICBjb25kPWxpc3Qoc3RyZXNzPSJmdWxsIiksIHJtLnJhbmVmPVQsIG4uZ3JpZD0xMDApJGZ2ClIuZi5iYXNlbGluZS5zY2h3YS5wbG90IDwtIHBsb3Rfc21vb3RoKFIuZi5iYXNlbGluZS5tb2QuQVIsIHZpZXc9Im1lYXN1cmVtZW50Lm5vIiwgcGxvdF9hbGw9ImRlY2FkZSIsIAogICAgICAgICAgICBjb25kPWxpc3Qoc3RyZXNzPSJzY2h3YSIpLCBybS5yYW5lZj1ULCBuLmdyaWQ9MTAwKSRmdgpSLmYuYmFzZWxpbmUucGxvdCA8LSByYmluZChSLmYuYmFzZWxpbmUuZnVsbC5wbG90LCBSLmYuYmFzZWxpbmUuc2Nod2EucGxvdCkKUi5mLmJhc2VsaW5lLnBsb3QkZGVjYWRlIDwtIGZhY3RvcihSLmYuYmFzZWxpbmUucGxvdCRkZWNhZGUsIGxldmVscz1jKCIxOTcwIiwiMTk4MCIsIjE5OTAiLCIyMDAwIikpCgojIGNyZWF0aW5nIGdyYXBoCmdncGxvdChSLmYuYmFzZWxpbmUucGxvdCwgYWVzKHg9bWVhc3VyZW1lbnQubm8sIHk9Zml0LCBncm91cD1kZWNhZGUsIGNvbD1kZWNhZGUsIGx0eT1kZWNhZGUpKSArCiAgZ2VvbV9saW5lKGx3ZD0xKSArCiAgZmFjZXRfZ3JpZCgufnN0cmVzcykgKwogIGdlb21fcmliYm9uKGFlcyh5bWluPWxsLCB5bWF4PXVsLCBncm91cD1kZWNhZGUpLCBjb2w9TkEsY29sPSJncmV5IiwgYWxwaGE9MC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9ImRlY2FkZSBvZlxucmVjb3JkaW5nIiwgdmFsdWVzPWMoIm9yYW5nZSIsImRhcmtvcmFuZ2UzIiwiZGVlcHNreWJsdWUxIiwiZGVlcHNreWJsdWU0IikpICsKICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShuYW1lPSJkZWNhZGUgb2ZcbnJlY29yZGluZyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ibWVhc3VyZW1lbnQgcG9pbnQiLCBsaW1pdHMgPSBjKDAsIDEwKSwgYnJlYWtzPXNlcSgwLDEwLDIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkYzIChIeikiLCBsaW1pdHM9YygyMDAwLCAzMDUwKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksIAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIiksCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpICsKICBnZ3RpdGxlKCJGMyBjaGFuZ2VzIGZvciAvci8gaW4gZmVtYWxlcyAoY29udHJvbGxpbmcgZm9yIGJhc2VsaW5lIEYzKSIpCiNnZ3NhdmUoImdyYXBocy9yX2ZlbWFsZV9mM19jaGFuZ2VfY29udHJvbC5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9NCkKYGBgCgoKCgoK